# Insteon Binding

Insteon is a proprietary home automation system that enables light switches, lights, thermostats, leak sensors, remote controls, motion sensors, and other electrically powered devices to interoperate through power lines, radio frequency (RF) communications, or both (dual-band) More about Insteon can be found on Wikipedia (opens new window).

It provides access to the Insteon network by means of either an Insteon PowerLinc Modem (PLM), the legacy 2242-222 Insteon Hub or the current 2245-222 Insteon Hub 2. The modem can be connected to the openHAB server either via a serial port (Model 2413S) or a USB port (Model 2413U). The Insteon PowerLinc Controller (Model 2414U) is not supported since it is a PLC not a PLM. The modem can also be connected via TCP (such as ser2net). The binding translates openHAB commands into Insteon messages and sends them on the Insteon network. Relevant messages from the Insteon network (like notifications about switches being toggled) are picked up by the modem and converted to openHAB state updates by the binding. The binding also supports sending and receiving of legacy X10 messages.

The openHAB binding supports configuring most of the device local settings, linking a device to the modem, managing link database records and scenes along with monitoring inbound/outbound messages. Other tools can be used to managed Insteon devices, such as the Insteon Terminal (opens new window) open source project, or the HouseLinc (opens new window) software from Insteon can also be used for configuration, but it wipes the modem link database clean on its initial use, requiring to re-link the modem to all devices.

At startup, the binding will download the modem database along with each configured device all-link database if not previously downloaded and currently awake. Therefore, the initialization on the first start may take some additional time to complete depending on the number of devices configured. The modem and device link databases are only downloaded once unless the binding receives an indication that a database was updated or marked to be refreshed via the openHAB console.

Important note as of openHAB 4.3.0

The binding has been rewritten to simplify the user experience by retrieving all the configuration directly from the device when possible, and improving the way the Insteon things are configured in MainUI. If switching from a previous release, you will need to reconfigure your Insteon environment with the new bridges, things and channels to take advantage of these enhancements. You can follow the migration guide.

However, the new version is fully backward compatible by supporting the legacy things. On the first start, existing device things connected to a network bridge will be migrated to the legacy-device thing type while still keeping the same ids to prevent any breakage. It is important to note that once the migration has occurred, downgrading to an older version will not be possible.

# Supported Things

Thing Type Description
hub1 Bridge An Insteon Hub Legacy that communicates with Insteon devices.
hub2 Bridge An Insteon Hub 2 that communicates with Insteon devices.
plm Bridge An Insteon PLM that communicates with Insteon devices.
device Thing An Insteon device such as a switch, dimmer, keypad, sensor, etc.
scene Thing An Insteon scene that controls multiple devices simultaneously.
x10 Thing An X10 device such as a switch, dimmer or sensor.

# Legacy Things

Thing Type Description
network Bridge An Insteon PLM or Hub that communicates with Insteon devices.
legacy-device Thing An Insteon or X10 device such as a switch, dimmer, keypad, sensor, etc.

# Discovery

An Insteon bridge is not automatically discovered and will have to be manually added. Once configured, depending on the bridge discovery parameters, any Insteon devices or scenes that exists in the modem database and is not currently configured will be automatically be added to the inbox. For the legacy bridge configuration, only missing device are discovered. The naming convention for devices is Vendor Model Description if its product data is retrievable, otherwise Insteon Device AA.BB.CC (opens new window), where AA.BB.CC is the Insteon device address. For scenes, it is Insteon Scene 42, where 42 is the scene group number. The device auto-discovery is enabled by default while disabled for scenes. X10 devices are not auto discovered.

# Thing Configuration

For bridge things, if the poll interval is too short, it will result in sluggish performance and no response when trying to send messages to devices. The default poll interval of 300 seconds has been tested and found to be a good compromise in a configuration of about 110 switches/dimmers.

# hub1

Parameter Default Required Description
hostname Yes Network address of the hub.
port 9761 No Network port of the hub.
devicePollIntervalInSeconds 300 No Device poll interval in seconds.
deviceDiscoveryEnabled true No Discover Insteon devices found in the hub database but not configured.
sceneDiscoveryEnabled false No Discover Insteon scenes found in the hub database but not configured.
deviceSyncEnabled false No Synchronize related devices based on their all-link database.

NOTE: Use this bridge to connect to a networked PLM via ser2net.

# hub2

Parameter Default Required Description
hostname Yes Network address of the hub.
port 25105 No Network port of the hub.
username Yes Username to access the hub.
password Yes Password to access the hub.
hubPollIntervalInMilliseconds 1000 No Hub poll interval in milliseconds.
devicePollIntervalInSeconds 300 No Device poll interval in seconds.
deviceDiscoveryEnabled true No Discover Insteon devices found in the hub database but not configured.
sceneDiscoveryEnabled false No Discover Insteon scenes found in the hub database but not configured.
deviceSyncEnabled false No Synchronize related devices based on their all-link database.

# plm

Parameter Default Required Description
serialPort Yes Serial port connected to the modem. Example: /dev/ttyS0 or COM1
baudRate 19200 No Serial port baud rate connected to the modem.
devicePollIntervalInSeconds 300 No Device poll interval in seconds.
deviceDiscoveryEnabled true No Discover Insteon devices found in the modem database but not configured.
sceneDiscoveryEnabled false No Discover Insteon scenes found in the modem database but not configured.
deviceSyncEnabled false No Synchronize related devices based on their all-link database.

# device

Parameter Required Description
address Yes Insteon address of the device. It can be found on the device. Example: 12.34.56.

The device type is automatically determined by the binding using the device product data. For a battery powered device that was never configured previously, it may take until the next time that device sends a broadcast message to be modeled properly. To speed up the process for this case, it is recommended to force the device to become awake after the associated bridge is online. Likewise, for a device that wasn't accessible during the binding initialization phase, press on its SET button once powered on to notify the binding that it is available.

# scene

Parameter Required Description
group Yes Insteon scene group number between 2 and 254. It can be found in the scene detailed information in the Insteon mobile app.

# x10

Parameter Required Description
houseCode Yes X10 house code of the device. Example: A
unitCode Yes X10 unit code of the device. Example: 1
deviceType Yes X10 device type
Supported X10 device types
Device Type Description
X10_Switch X10 Switch
X10_Dimmer X10 Dimmer
X10_Sensor X10 Sensor

# network

Parameter Default Required Description
port Yes Port configuration.
devicePollIntervalSeconds 300 No Poll interval of devices in seconds.
additionalDevices No File with additional device types.
additionalFeatures No File with additional feature templates.

NOTE: For users upgrading from InsteonPLM, The parameter port_1 is now port.

Port configuration examples
Modem Type Port Configuration
Hub (2245-222) /hub2/my_user_name:my_password@192.168.1.100:25105,poll_time=1000
Legacy Hub (2242-222) /hub/192.168.1.100:9761
PLM /dev/ttyS0 or /dev/ttyUSB0 (Linux)
COM1 (Windows)
/tcp/192.168.1.100:9761 (Networked via ser2net)
Smartenit ZBPLM /dev/ttyUSB0,baudRate=115200 (Linux)

# legacy-device

Parameter Required Description
address Yes Device address. Example: 12.34.56 (Insteon) or A.1 (X10)
productKey Yes Product key used to identify the model of the device.
deviceConfig No Optional JSON object with device specific configuration.
Supported product keys
Model Description Product Key
2477D SwitchLinc Dimmer F00.00.01
2477S SwitchLinc Switch F00.00.02
2845-222 Hidden Door Sensor F00.00.03
2876S ICON Switch F00.00.04
2456D3 LampLinc V2 F00.00.05
2442-222 Micro Dimmer F00.00.06
2453-222 DIN Rail On/Off F00.00.07
2452-222 DIN Rail Dimmer F00.00.08
2458-A1 MorningLinc RF Lock Controller F00.00.09
2852-222 Leak Sensor F00.00.0A
2672-422 LED Dimmer F00.00.0B
2476D SwitchLinc Dimmer F00.00.0C
2634-222 On/Off Dual-Band Outdoor Module F00.00.0D
2342-2 Mini Remote F00.00.10
2663-222 On/Off Outlet 0x000039
2466D ToggleLinc Dimmer F00.00.11
2466S ToggleLinc Switch F00.00.12
2672-222 LED Bulb F00.00.13
2487S KeypadLinc On/Off 6-Button F00.00.14
2334-232 KeypadLink Dimmer 6-Button F00.00.15
2334-232 KeypadLink Dimmer 8-Button F00.00.16
2423A1 iMeter Solo Power Meter F00.00.17
2423A1 Thermostat 2441TH F00.00.18
2457D2 LampLinc Dimmer F00.00.19
2475SDB In-LineLinc Relay F00.00.1A
2635-222 On/Off Module F00.00.1B
2475F FanLinc Module F00.00.1C
2456S3 ApplianceLinc F00.00.1D
2674-222 LED Bulb (recessed) F00.00.1E
2477SA1 220V 30-amp Load Controller N/O F00.00.1F
2342-222 Mini Remote (8 Button) F00.00.20
2441V Insteon Thermostat Adaptor for Venstar F00.00.21
2982-222 Insteon Smoke Bridge F00.00.22
2487S KeypadLinc On/Off 8-Button F00.00.23
2450 IO Link 0x00001A
2486D KeypadLinc Dimmer 0x000037
2484DWH8 KeypadLinc Countdown Timer 0x000041
Various PLM or Hub 0x000045
2843-222 Wireless Open/Close Sensor 0x000049
2842-222 Motion Sensor 0x00004A
2844-222 Motion Sensor II F00.00.24
2486DWH8 KeypadLinc Dimmer 0x000051
2472D OutletLincDimmer 0x000068
X10 switch generic X10 switch X00.00.01
X10 dimmer generic X10 dimmer X00.00.02
X10 motion generic X10 motion sensor X00.00.03

# Channels

Below is the list of possible channels for the Insteon devices. In order to determine which channels a device supports, check the device in the UI, or use the insteon device listAll console command.

# State Channels

Channel Type Access Mode Description
3-way-mode Switch R/W 3-Way Toggle Mode
ac-delay Number:Time R/W AC Delay
alert-delay Switch R/W Alert Delay
alert-duration Number:Time R/W Alert Duration
alert-type String R/W Alert Type
armed Switch R/W Armed
backlight-duration Number:Time R/W Back Light Duration
battery-level Number:Dimensionless R Battery Level
battery-powered Switch R Battery Powered
beep Switch W Beep
button-a Switch R/W Button A
button-b Switch R/W Button B
button-c Switch R/W Button C
button-d Switch R/W Button D
button-e Switch R/W Button E
button-f Switch R/W Button F
button-g Switch R/W Button G
button-h Switch R/W Button H
button-beep Switch R/W Beep on Button Press
button-config String R/W Button Config
button-lock Switch R/W Button Lock
carbon-monoxide-alarm Switch R Carbon Monoxide Alarm
contact Contact R Contact Sensor
cool-setpoint Number:Temperature R/W Cool Setpoint
daytime Switch R Daytime
dehumidify-setpoint Number:Dimensionless R/W Dehumidify Setpoint
dimmer Dimmer R/W Dimmer
energy-offset Number:Temperature R/W Energy Temperature Offset
energy-reset Switch W Energy Usage Reset
energy-saving Switch R Energy Saving Mode
energy-usage Number:Energy R Energy Usage
fan-mode String R/W Fan Mode
fan-speed String R/W Fan Speed
fan-state Switch R Fan State
fast-on-off Switch W Fast On/Off
heartbeat-interval Number:Time R/W Heartbeat Interval
heartbeat-on-off Switch R/W Heartbeat Enabled
heat-setpoint Number:Temperature R/W Heat Setpoint
humidifier-state String R Humidifier State
humidify-setpoint Number:Dimensionless R/W Humidify Setpoint
humidity Number:Dimensionless R Ambient Humidity
last-heard-from DateTime R Last Heard From
leak Switch R Leak Sensor
led-brightness Dimmer R/W LED Brightness Level
led-on-off Switch R/W LED Enabled
led-traffic Switch R/W LED Traffic Blinking
light-level Number:Dimensionless R Ambient Light Level
load Switch R Load Sensor
load-sense Switch R/W Load Sense
load-sense-bottom Switch R/W Load Sense Bottom Outlet
load-sense-top Switch R/W Load Sense Top Outlet
lock Switch R/W Lock
low-battery Switch R Low Battery Alert
malfunction Switch R Malfunction Alert
manual-change Rollershutter W Manual Change
momentary-duration Number:Time R/W Momentary Duration
monitor-mode Switch R/W Monitor Mode
motion Switch R Motion Sensor
on-level Dimmer R/W On Level
operation-mode String R/W Switch Operation Mode
outlet-bottom Switch R/W Bottom Outlet
outlet-top Switch R/W Top Outlet
power-usage Number:Power R Power Usage
program1 Player R/W Program 1
program2 Player R/W Program 2
program3 Player R/W Program 3
program4 Player R/W Program 4
program-lock Switch R/W Local Programming Lock
pump Switch R/W Pump Control
ramp-rate Number:Time R/W Ramp Rate
relay-mode String R/W Output Relay Mode
relay-sensor-follow Switch R/W Output Relay Sensor Follow
resume-dim Switch R/W Resume Dim Level
reverse-direction Switch R/W Reverse Motor Direction
rollershutter Rollershutter R/W Rollershutter
scene Switch R/W Scene
siren Switch R/W Siren
smoke-alarm Switch R Smoke Alarm
stage1-duration Number:Time R/W Stage 1 Duration
stay-awake Switch R/W Stay Awake for Extended Time
switch Switch R/W Switch
sync-time Switch W Synchronize Time
system-mode String R/W System Mode
system-state String R System State
tamper-switch Contact R Tamper Switch
temperature Number:Temperature R Ambient Temperature
temperature-scale String R/W Temperature Scale
test-alarm Switch R Test Alarm
time-format String R/W Time Format
toggle-mode-button-a String R/W Toggle Mode Button A
toggle-mode-button-b String R/W Toggle Mode Button B
toggle-mode-button-c String R/W Toggle Mode Button C
toggle-mode-button-d String R/W Toggle Mode Button D
toggle-mode-button-e String R/W Toggle Mode Button E
toggle-mode-button-f String R/W Toggle Mode Button F
toggle-mode-button-g String R/W Toggle Mode Button G
toggle-mode-button-h String R/W Toggle Mode Button H
valve1 Switch R/W Valve 1
valve2 Switch R/W Valve 2
valve3 Switch R/W Valve 3
valve4 Switch R/W Valve 4
valve5 Switch R/W Valve 5
valve6 Switch R/W Valve 6
valve7 Switch R/W Valve 7
valve8 Switch R/W Valve 8

# Trigger Channels

Channel Description
event-button Event Button
event-button-a Event Button A
event-button-b Event Button B
event-button-c Event Button C
event-button-d Event Button D
event-button-e Event Button E
event-button-f Event Button F
event-button-g Event Button G
event-button-h Event Button H
event-button-main Event Button Main
event-button-bottom Event Button Bottom
event-button-top Event Button Top
im-event-button Event Button

The supported triggered events for Insteon Device things:

Event Description
PRESSED_ON Button Pressed On (Regular On)
PRESSED_OFF Button Pressed Off (Regular Off)
DOUBLE_PRESSED_ON Button Double Pressed On (Fast On)
DOUBLE_PRESSED_OFF Button Double Pressed Off (Fast Off)
HELD_UP Button Held Up (Manual Change Up)
HELD_DOWN Button Held Down (Manual Change Down)
RELEASED Button Released (Manual Change Stop)

And for Insteon Hub and PLM things:

Event Description
PRESSED Button Pressed
HELD Button Held
RELEASED Button Released

# Legacy Channels

Channel Type Description
acDelay Number AC Delay
backlightDuration Number Back Light Duration
batteryLevel Number Battery Level
batteryPercent Number:Dimensionless Battery Percent
batteryWatermarkLevel Number Battery Watermark Level
beep Switch Beep
bottomOutlet Switch Bottom Outlet
buttonA Switch Button A
buttonB Switch Button B
buttonC Switch Button C
buttonD Switch Button D
buttonE Switch Button E
buttonF Switch Button F
buttonG Switch Button G
buttonH Switch Button H
broadcastOnOff Switch Broadcast On/Off
contact Contact Contact
coolSetPoint Number Cool Setpoint
dimmer Dimmer Dimmer
fan Number Fan
fanMode Number Fan Mode
fastOnOff Switch Fast On/Off
fastOnOffButtonA Switch Fast On/Off Button A
fastOnOffButtonB Switch Fast On/Off Button B
fastOnOffButtonC Switch Fast On/Off Button C
fastOnOffButtonD Switch Fast On/Off Button D
heatSetPoint Number Heat Setpoint
humidity Number Humidity
humidityHigh Number Humidity High
humidityLow Number Humidity Low
isCooling Number Is Cooling
isHeating Number Is Heating
keypadButtonA Switch Keypad Button A
keypadButtonB Switch Keypad Button B
keypadButtonC Switch Keypad Button C
keypadButtonD Switch Keypad Button D
keypadButtonE Switch Keypad Button E
keypadButtonF Switch Keypad Button F
keypadButtonG Switch Keypad Button G
keypadButtonH Switch Keypad Button H
kWh Number:Energy Kilowatt Hour
lastHeardFrom DateTime Last Heard From
ledBrightness Number LED brightness
ledOnOff Switch LED On/Off
lightDimmer Dimmer light Dimmer
lightLevel Number Light Level
lightLevelAboveThreshold Contact Light Level Above/Below Threshold
loadDimmer Dimmer Load Dimmer
loadSwitch Switch Load Switch
loadSwitchFastOnOff Switch Load Switch Fast On/Off
loadSwitchManualChange Number Load Switch Manual Change
lowBattery Contact Low Battery
manualChange Number Manual Change
manualChangeButtonA Number Manual Change Button A
manualChangeButtonB Number Manual Change Button B
manualChangeButtonC Number Manual Change Button C
manualChangeButtonD Number Manual Change Button D
notification Number Notification
onLevel Number On Level
rampDimmer Dimmer Ramp Dimmer
rampRate Number Ramp Rate
reset Switch Reset
stage1Duration Number Stage 1 Duration
switch Switch Switch
systemMode Number System Mode
tamperSwitch Contact Tamper Switch
temperature Number:Temperature Temperature
temperatureLevel Number Temperature Level
topOutlet Switch Top Outlet
update Switch Update
watts Number:Power Watts

# Full Example

# Things

Bridge insteon:plm:home [serialPort="/dev/ttyUSB0"] {
  Thing device 22f8a8 [address="22.F8.A8"]
  Thing device 238d93 [address="23.8D.93"]
  Thing device 238f55 [address="23.8F.55"]
  Thing device 238fc9 [address="23.8F.C9"]
  Thing device 23b0d9 [address="23.B0.D9"]
  Thing scene scene42 [group=42]
  Thing x10 a2 [houseCode="A", unitCode=2, deviceType="X10_Switch"]
}
Legacy
Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device 22F8A8 [address="22.F8.A8", productKey="F00.00.15"] {
    Channels:
      Type keypadButtonA : keypadButtonA [ group=3 ]
      Type keypadButtonB : keypadButtonB [ group=4 ]
      Type keypadButtonC : keypadButtonC [ group=5 ]
      Type keypadButtonD : keypadButtonD [ group=6 ]
  }
  Thing device 238D93 [address="23.8D.93", productKey="F00.00.12"]
  Thing device 238F55 [address="23.8F.55", productKey="F00.00.11"] {
    Channels:
      Type dimmer        : dimmer [related="23.B0.D9+23.8F.C9"]
  }
  Thing device 238FC9 [address="23.8F.C9", productKey="F00.00.11"] {
    Channels:
      Type dimmer        : dimmer [related="23.8F.55+23.B0.D9"]
  }
  Thing device 23B0D9 [address="23.B0.D9", productKey="F00.00.11"] {
    Channels:
      Type dimmer        : dimmer [related="23.8F.55+23.8F.C9"]
  }
  Thing device 243141 [address="24.31.41", productKey="F00.00.11"]  {
    Channels:
      Type dimmer        : dimmer [dimmermax=60]
  }
}

# Items

Switch switch1 { channel="insteon:device:home:243141:switch" }
Dimmer dimmer1 { channel="insteon:device:home:238f55:dimmer" }
Dimmer dimmer2 { channel="insteon:device:home:23b0d9:dimmer" }
Dimmer dimmer3 { channel="insteon:device:home:238fc9:dimmer" }
Dimmer keypad  { channel="insteon:device:home:22f8a8:dimmer" }
Switch keypadA { channel="insteon:device:home:22f8a8:button-a" }
Switch keypadB { channel="insteon:device:home:22f8a8:button-b" }
Switch keypadC { channel="insteon:device:home:22f8a8:button-c" }
Switch keypadD { channel="insteon:device:home:22f8a8:button-d" }
Switch scene42 { channel="insteon:scene:home:scene42:scene" }
Switch switch2 { channel="insteon:x10:home:a2:switch" }

# Console Commands

The binding provides commands to help with configuring and troubleshooting. Most commands support auto-completion during input based on the existing configuration. If a legacy network bridge is active, the console will revert to legacy commands. Enter openhab:insteon or insteon in the console to get a list of available commands.

openhab> insteon
Usage: openhab:insteon modem - Insteon modem commands
Usage: openhab:insteon device - Insteon/X10 device commands
Usage: openhab:insteon scene - Insteon scene commands
Usage: openhab:insteon channel - Insteon channel commands
Usage: openhab:insteon debug - Insteon debug commands
Legacy
openhab> insteon
Usage: openhab:insteon display_devices - display devices that are online, along with available channels
Usage: openhab:insteon display_channels - display channels that are linked, along with configuration information
Usage: openhab:insteon display_local_database - display Insteon PLM or hub database details
Usage: openhab:insteon display_monitored - display monitored device(s)
Usage: openhab:insteon start_monitoring all|address - start displaying messages received from device(s)
Usage: openhab:insteon stop_monitoring all|address - stop displaying messages received from device(s)
Usage: openhab:insteon send_standard_message address flags cmd1 cmd2 - send standard message to a device
Usage: openhab:insteon send_extended_message address flags cmd1 cmd2 [up to 13 bytes] - send extended message to a device
Usage: openhab:insteon send_extended_message_2 address flags cmd1 cmd2 [up to 12 bytes] - send extended message with a two byte crc to a device

# Insteon Groups and Scenes

How do Insteon devices tell other devices on the network that their state has changed? They send out a broadcast message, labeled with a specific group number. All devices (called responders) that are configured to listen to this message will then go into a pre-defined state. For instance when light switch A is switched to "ON", it will send out a message to group #1, and all responders will react to it, e.g they may go into the "ON" position as well. Since more than one device can participate, the sending out of the broadcast message and the subsequent state change of the responders is referred to as "triggering a scene".

Many Insteon devices send out messages on different group numbers, depending on what happens to them. A leak sensor may send out a message on group #1 when dry, and on group #2 when wet. The default group used for e.g. linking two light switches is usually group #1.

The binding can now automatically determines the broadcast groups between the modem and linked devices, based on their all-link databases.

By default, the binding only sends direct messages to the intended device to update its state, leaving the state of the related devices unchanged. Whenever the bridge related device synchronization parameter deviceSyncEnabled is set to true, broadcast messages for supported Insteon commands (e.g. on/off, bright/dim, manual change) are sent to all responders of a given group, updating all related devices in one request. If no broadcast group is determined or for Insteon commands that don't support broadcasting (e.g. percent), direct messages are sent to each related device instead, to adjust their level based on their all-link database.

# Process

Before Insteon devices communicate with one another, they must be linked. During the linking process, one of the devices will be the "Controller", the other the "Responder".

The responder listens to messages from the controller, and reacts to them. Note that except for the case of a motion detector (which is just a controller to the modem), the modem controls the device (e.g. send on/off messages to it), and the device controls the modem, so it learns about the switch being toggled. For this reason, most devices and in particular switches/dimmers should be linked twice, with one taking the role of controller during the first linking, and the other acting as controller during the second linking process. To do so, first press and hold the "Set" button on the modem until the light starts blinking. Then press and hold the "Set" button on the remote device, e.g. the light switch, until it double beeps (the light on the modem should go off as well). Now do exactly the reverse: press and hold the "Set" button on the remote device until its light starts blinking, then press and hold the "Set" button on the modem until it double beeps, and the light of the remote device (switch) goes off.

Alternatively, the binding can link a device to the modem programmatically using the insteon modem addDevice console command. Based on the initial set button pressed event received, the device will be linked one or both ways. Once the newly linked device is added as a thing, additional links for more complex devices can be added using the insteon device addMissingLinks console command.

# Insteon Devices

Since Insteon devices can have multiple features (for instance a switchable relay and a contact sensor) under a single Insteon device, an openHAB item is not bound to a device, but to a given feature of a device. For example, the following lines would create two Number items referring to the same thermostat device, but to different features of it:

Number:Temperature  thermostatCoolSetpoint "cool setpoint [%.1f °F]" { channel="insteon:device:home:32f422:cool-setpoint" }
Number:Temperature  thermostatHeatSetpoint "heat setpoint [%.1f °F]" { channel="insteon:device:home:32f422:heat-setpoint" }

# Switches

The following example shows how to configure a simple light switch (2477S) in the .items file:

Switch officeLight "office light" { channel="insteon:device:home:aabbcc:switch" }

# Dimmers

Here is how to configure a simple dimmer (2477D) in the .items file:

Dimmer kitchenChandelier "kitchen chandelier" { channel="insteon:device:home:aabbcc:dimmer" }

For ON command requests, the binding uses the device on level and ramp rate local settings to set the dimmer level, the same way it would be set when physically pressing on the dimmer. These settings can be controlled using the on-level and ramp-rate channels.

Alternatively, these settings can be overridden using the dimmer channel parameters onLevel and rampRate. Doing so will result in different type of commands being triggered as opposed to having separate channels previously such as fastOnOff, manualChange and rampDimmer handling it.

When the rampRate parameter is configured, the binding will send a ramp rate command (previously triggered by the rampDimmer channel) to the relevant device to set the level at the defined ramp rate. When this parameter is set to instant (0.1 sec), on/off commands will trigger what used to be handled by the fastOnOff channel. And percent commands will trigger what is defined in the Insteon protocol as instant change requests.

As far as the previously known manualChange channel, it has been rolled into the rollershutter channel for window covering using UP, DOWN and STOP commands. For the dimmer channel, the INCREASE and DECREASE commands can be used instead.

Ultimately, the dimmer channel parameters can be used to create custom channels via a thing file that can work as an alternative to having to configure an Insteon scene for a single device.

Thing device 23b0d9 [address="23.B0.D9"] {
  Channels:
    // 50% on level at 2.5 minutes ramp rate
    Type dimmer : custom1 [onLevel=50, rampRate=150]
    // 80% on level at device configured ramp rate
    Type dimmer : custom2 [onLevel=80]
    // device configured on level at 8 minutes ramp rate
    Type dimmer : custom3 [rampRate=480]
}
Legacy
Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC [address="AA.BB.CC", productKey="F00.00.11"]  {
    Channels:
      Type dimmer     : dimmer [dimmermax=70]
  }
  Thing device AABBCD [address="AA.BB.CD", productKey="F00.00.15"]  {
    Channels:
      Type loadDimmer : loadDimmer [dimmermax=60]
  }
}

# Keypads

The Insteon keypad devices typically control one main load and have a number of buttons that will send out group broadcast messages to trigger a scene. To use the main load switch within openHAB, link the modem and device with the set buttons as usual. For the scene buttons, each one will send out a message for a different, predefined group. The button numbering used internally by the device must be mapped to whatever labels are printed on the physical buttons of the device. Here is an example correspondence table:

Group Button Number 2487S Label
0x01 1 (Load)
0x03 3 A
0x04 4 B
0x05 5 C
0x06 6 D

When e.g. the "A" button is pressed (that's button #3 internally) a broadcast message will be sent out to all responders configured to listen to Insteon group #3. In this case, the modem must be configured as a responder to group #3 (and #4, #5, #6) messages coming from the keypad. These groups can be linked programmatically using the insteon device addMissingLinks console command, or via the device set buttons (see the keypad instructions).

While previously, keypad buttons required a broadcast group to be configured, the binding now automatically determines that setting, based on the device link databases, deprecating the group channel parameter. By default, the binding will only change the button led state when receiving on/off commands, depending on the keypad local radio group settings. For button broadcast group support, set the bridge parameter deviceSyncEnabled to true. Additionally, for button toggle mode set to always on or off, only ON or OFF commands will be processed, in line with the physical interaction.

# Keypad Switches

# Items

The following items will expose a keypad switch and its associated buttons:

Switch keypadSwitch             "main switch"        { channel="insteon:device:home:aabbcc:switch" }
Switch keypadSwitchA            "button A"           { channel="insteon:device:home:aabbcc:button-a"}
Switch keypadSwitchB            "button B"           { channel="insteon:device:home:aabbcc:button-b"}
Switch keypadSwitchC            "button C"           { channel="insteon:device:home:aabbcc:button-c"}
Switch keypadSwitchD            "button D"           { channel="insteon:device:home:aabbcc:button-d"}
Legacy
Switch keypadSwitch             "main switch"        { channel="insteon:device:home:AABBCC:switch" }
Switch keypadSwitchA            "button A"           { channel="insteon:device:home:AABBCC:buttonA"}
Switch keypadSwitchB            "button B"           { channel="insteon:device:home:AABBCC:buttonB"}
Switch keypadSwitchC            "button C"           { channel="insteon:device:home:AABBCC:buttonC"}
Switch keypadSwitchD            "button D"           { channel="insteon:device:home:AABBCC:buttonD"}
# Sitemap

The following sitemap will bring the items to life in the GUI:

Frame label="Keypad" {
  Switch item=keypadSwitch label="main"
  Switch item=keypadSwitchA label="button A"
  Switch item=keypadSwitchB label="button B"
  Switch item=keypadSwitchC label="button C"
  Switch item=keypadSwitchD label="button D"
}
# Rules

The following rules will monitor regular on/off, fast on/off and manual change button events:

rule "Main Button Off Event"
when
  Channel 'insteon:device:home:aabbcc:event-button-main' triggered PRESSED_OFF
then
  // do something
end

rule "Main Button Fast On/Off Events"
when
  Channel 'insteon:device:home:aabbcc:event-button-main' triggered DOUBLE_PRESSED_ON or
  Channel 'insteon:device:home:aabbcc:event-button-main' triggered DOUBLE_PRESSED_OFF
then
  // do something
end

rule "Main Button Manual Change Stop Event"
when
  Channel 'insteon:device:home:aabbcc:event-button-main' triggered RELEASED
then
  // do something
end

rule "Keypad Button A On Event"
when
  Channel 'insteon:device:home:aabbcc:event-button-a' triggered PRESSED_ON
then
  // do something
end
Legacy
# Items

Here is a simple example, just using the load (main) switch:

Switch keypadSwitch             "main load"          { channel="insteon:device:home:AABBCC:loadSwitch" }
Number keypadSwitchManualChange "main manual change" { channel="insteon:device:home:AABBCC:loadSwitchManualChange" }
Switch keypadSwitchFastOnOff    "main fast on/off"   { channel="insteon:device:home:AABBCC:loadSwitchFastOnOff" }
Switch keypadSwitchA            "keypad button A"    { channel="insteon:device:home:AABBCC:keypadButtonA"}
Switch keypadSwitchB            "keypad button B"    { channel="insteon:device:home:AABBCC:keypadButtonB"}
Switch keypadSwitchC            "keypad button C"    { channel="insteon:device:home:AABBCC:keypadButtonC"}
Switch keypadSwitchD            "keypad button D"    { channel="insteon:device:home:AABBCC:keypadButtonD"}
# Things

The value after group must either be a number or string. The hexadecimal value 0xf3 can either converted to a numeric value 243 or the string value "0xf3".

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC [address="AA.BB.CC", productKey="F00.00.15"] {
    Channels:
      Type keypadButtonA : keypadButtonA [ group="0xf3" ]
      Type keypadButtonB : keypadButtonB [ group="0xf4" ]
      Type keypadButtonC : keypadButtonC [ group="0xf5" ]
      Type keypadButtonD : keypadButtonD [ group="0xf6" ]
  }
}
# Sitemap

The following sitemap will bring the items to life in the GUI:

Frame label="Keypad" {
  Switch item=keypadSwitch label="main"
  Switch item=keypadSwitchFastOnOff label="fast on/off"
  Switch item=keypadSwitchManualChange label="manual change" mappings=[ 0="DOWN", 1="STOP",  2="UP"]
  Switch item=keypadSwitchA label="button A"
  Switch item=keypadSwitchB label="button B"
  Switch item=keypadSwitchC label="button C"
  Switch item=keypadSwitchD label="button D"
}

# Keypad Dimmers

The keypad dimmers are like keypad switches, except that the main load is dimmable.

# Items
Dimmer keypadDimmer           "main dimmer" { channel="insteon:device:home:aabbcc:dimmer" }
Switch keypadDimmerButtonA    "button A"    { channel="insteon:device:home:aabbcc:button-a" }
Legacy
Dimmer keypadDimmer           "main dimmer" { channel="insteon:device:home:AABBCC:dimmer" }
Switch keypadDimmerButtonA    "button A"    { channel="insteon:device:home:AABBCC:buttonA" }
# Sitemap
Slider item=keypadDimmer label="main" switchSupport
Switch item=keypadDimmerButtonA label="button A"

# Outlets

Here's how to configure the top and bottom outlet of the in-wall 2 outlet controller:

Switch outletTop    "Outlet Top"    { channel="insteon:device:home:aabbcc:outlet-top" }
Switch outletBottom "Outlet Bottom" { channel="insteon:device:home:aabbcc:outlet-bottom" }
Legacy
Switch outletTop    "Outlet Top"    { channel="insteon:device:home:AABBCC:topOutlet" }
Switch outletBottom "Outlet Bottom" { channel="insteon:device:home:AABBCC:bottomOutlet" }

# Mini Remotes

Link the mini remote to be a controller of the modem by using the set button. Link all buttons, one after the other. The 4-button mini remote sends out messages on groups 0x01 - 0x04, each corresponding to one button. The modem's link database (see Insteon Terminal (opens new window)) should look like this:

0000 xx.xx.xx                       xx.xx.xx  RESP  10100010 group: 01 data: 02 2c 41
0000 xx.xx.xx                       xx.xx.xx  RESP  10100010 group: 02 data: 02 2c 41
0000 xx.xx.xx                       xx.xx.xx  RESP  10100010 group: 03 data: 02 2c 41
0000 xx.xx.xx                       xx.xx.xx  RESP  10100010 group: 04 data: 02 2c 41

The mini remote buttons cannot be modeled as items since they don't have a state or can receive commands. However, button triggered events can be monitored through rules that can set off subsequent actions:

# Rules
rule "Mini Remote Button A Pressed On"
when
  Channel 'insteon:device:home:mini-remote:event-button-a' triggered PRESSED_ON
then
  // do something
end

# Motion Sensors

Link such that the modem is a responder to the motion sensor.

# Items
Switch               motionSensor             "motion sensor [MAP(motion.map):%s]" { channel="insteon:device:home:aabbcc:motion"}
Number:Dimensionless motionSensorBatteryLevel "battery level [%.1f %%]"            { channel="insteon:device:home:aabbcc:battery-level" }
Number:Dimensionless motionSensorLightLevel   "light level [%.1f %%]"              { channel="insteon:device:home:aabbcc:light-level" }
Legacy
Contact motionSensor             "motion sensor [MAP(motion.map):%s]" { channel="insteon:device:home:AABBCC:contact"}
Number  motionSensorBatteryLevel "motion sensor battery level"        { channel="insteon:device:home:AABBCC:batteryLevel" }
Number  motionSensorLightLevel   "motion sensor light level"          { channel="insteon:device:home:AABBCC:lightLevel" }

and create a file "motion.map" in the transforms directory with these entries:

ON=detected
OFF=cleared
-=unknown

The motion sensor II includes additional channels:

Contact            motionSensorTamperSwitch "tamper switch [MAP(contact.map):%s]" { channel="insteon:device:home:aabbcc:tamper-switch" }
Number:Temperature motionSensorTemperature  "temperature [%.1f °F]"               { channel="insteon:device:home:aabbcc:temperature" }
Legacy
Contact            motionSensorTamperSwitch "tamper switch [MAP(contact.map):%s]" { channel="insteon:device:home:AABBCC:tamperSwitch" }
Number:Temperature motionSensorTemperature  "temperature [%.1f °F]"               { channel="insteon:device:home:AABBCC:temperature" }

The temperature is automatically calculated in Fahrenheit based on the motion sensor II powered source. Since that sensor might not be calibrated correctly, the output temperature may need to be offset on the openHAB side.

The battery and light level are only updated when either there is motion, light level above/below threshold, tamper switch activated, or the sensor battery runs low.

Legacy

If the alternate heartbeat is enabled, the device can be configured to not query the device and rely on the data from the alternate heartbeat. Disabling the querying of the device should provide more accurate battery data since it appears to fluctuate with queries of the device. This can be configured with the device configuration parameter of the device. The key in the JSON object is heartbeatOnly and the value is a boolean:

# Things

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC [address="AA.BB.CC", productKey="F00.00.24", deviceConfig="{'heartbeatOnly': true}"]
}

The temperature can be calculated in Fahrenheit using the following formulas:

  • If the device is battery powered: temperature = 0.73 * motionSensorTemperatureLevel - 20.53

  • If the device is USB powered: temperature = 0.72 * motionSensorTemperatureLevel - 24.61

    Since the motion sensor II might not be calibrated correctly, the values 20.53 and 24.61 can be adjusted as necessary to produce the correct temperature.

# Hidden Door Sensors

Similar in operation to the motion sensor above. Link such that the modem is a responder to the motion sensor.

# Items
Contact              doorSensor             "door sensor [MAP(contact.map):%s]" { channel="insteon:device:home:aabbcc:contact" }
Number:Dimensionless doorSensorBatteryLevel "battery level [%.1f %%]"           { channel="insteon:device:home:aabbcc:battery-level" }
Legacy
Contact              doorSensor             "door sensor [MAP(contact.map):%s]" { channel="insteon:device:home:AABBCC:contact" }
Number:Dimensionless doorSensorBatteryLevel "battery level [%.1f %%]"           { channel="insteon:device:home:AABBCC:batteryLevel" }

and create a file "contact.map" in the transforms directory with these entries:

OPEN=open
CLOSED=closed
-=unknown

Note that battery level is only updated when the sensor is triggered or through its daily heartbeat.

# Locks

It is important to sync with the lock contorller within 5 feet to avoid bad connection and link twice for both ON and OFF functionality.

# Items
Switch doorLock "Front Door [MAP(lock.map):%s]"  { channel="insteon:device:home:aabbcc:lock" }
Legacy
Switch doorLock "Front Door [MAP(lock.map):%s]"  { channel="insteon:device:home:AABBCC:switch" }

and create a file "lock.map" in the transforms directory with these entries:

ON=locked
OFF=unlocked
-=unknown

# I/O Linc (garage door openers)

The I/O Linc devices are really two devices in one: a relay and a contact. To control the relay, link the modem as a controller using the set buttons as described in the instructions. To get the status of the contact, the modem must also be linked as a responder to the I/O Linc. The I/O Linc has a feature to invert the contact or match the contact when it sends commands to any linked responders. This is based on the status of the contact when it is linked, and was intended for controlling other devices with the contact. The binding expects the contact to be inverted to work properly. Ensure the contact is OFF (status LED is dark/garage door open) when linking the modem as a responder to the I/O Linc in order for it to function properly.

# Items
Switch  garageDoorOpener  "door opener"                        { channel="insteon:device:home:aabbcc:switch" }
Contact garageDoorContact "door contact [MAP(contact.map):%s]" { channel="insteon:device:home:aabbcc:contact" }

and create a file "contact.map" in the transforms directory with these entries:

OPEN=open
CLOSED=closed
-=unknown

NOTE: If the I/O Linc contact status appears delayed, or returns the wrong value when the sensor changes states, the contact was likely ON (status LED lit) when the modem was linked as a responder. Examples of this behavior would include: The status remaining CLOSED for up to 3 minutes after the door is opened, or the status remains OPEN for up to three minutes after the garage is opened and immediately closed again. To resolve this behavior the I/O Linc will need to be unlinked and then re-linked to the modem with the contact OFF (stats LED off). That would be with the door open when using the Insteon garage kit.

# Fan Controllers

Here is an example configuration for a FanLinc module, which has a dimmable light and a variable speed fan:

# Items
Dimmer fanLincDimmer "dimmer [%d %%]" { channel="insteon:device:home:aabbcc:dimmer" }
String fanLincFan    "fan speed"      { channel="insteon:device:home:aabbcc:fan-speed" }
Legacy
Dimmer fanLincDimmer "dimmer [%d %%]" { channel="insteon:device:home:AABBCC:lightDimmer" }
Number fanLincFan    "fan"            { channel="insteon:device:home:AABBCC:fan"}
# Sitemap
Slider item=fanLincDimmer switchSupport
Switch item=fanLincFan mappings=[ OFF="OFF", LOW="LOW", MEDIUM="MEDIUM", HIGH="HIGH" ]

# Power Meters

The iMeter Solo reports both energy and power usage, and is updated during the normal polling process of the devices. Send a REFRESH command to force update the current values for the device. Additionally, the device can be reset.

See the example below:

# Items
Number:Power  iMeterPower   "power [%d W]"       { channel="insteon:device:home:aabbcc:power-usage" }
Number:Energy iMeterEnergy  "energy [%.04f kWh]" { channel="insteon:device:home:aabbcc:energy-usage" }
Switch        iMeterReset   "reset"              { channel="insteon:device:home:aabbcc:reset" }
Legacy
Number:Power  iMeterWatts   "iMeter [%d watts]"   { channel="insteon:device:home:AABBCC:watts" }
Number:Energy iMeterKwh     "iMeter [%.04f kWh]"  { channel="insteon:device:home:AABBCC:kWh" }
Switch        iMeterUpdate  "iMeter Update"       { channel="insteon:device:home:AABBCC:update" }
Switch        iMeterReset   "iMeter Reset"        { channel="insteon:device:home:AABBCC:reset" }

# Sirens

When turning on the siren directly, the binding will trigger the siren with no delay and up to the maximum duration (~2 minutes). The channels to change the alert delay and duration are only used for the siren arming behavior.

Here is an example configuration for a siren module:

# Items
Switch siren                   "siren"                 { channel="insteon:device:home:aabbcc:siren" }
Switch sirenArmed              "armed"                 { channel="insteon:device:home:aabbcc:armed" }
Switch sirenAlertDelay         "alert delay"           { channel="insteon:device:home:aabbcc:alert-delay" }
Number:Time sirenAlertDuration "alert duration [%d s]" { channel="insteon:device:home:aabbcc:alert-duration" }
String sirenAlertType          "alert type [%s]"       { channel="insteon:device:home:aabbcc:alert-type" }
# Sitemap
Switch   item=siren
Text     item=sirenArmed
Switch   item=sirenAlertDelay
Setpoint item=sirenAlertDuration minValue=0 maxValue=127 step=1
Switch   item=sirenAlertType mappings=[ CHIME="CHIME", LOUD_SIREN="LOUD SIREN" ]

# Smoke Detectors

The smoke bridge monitors First Alert ONELINK smoke and carbon monoxide detectors.

Here is an example configuration for a smoke bridge:

# Items
Switch smokeAlarm          "smoke alarm"           { channel="insteon:device:home:aabbcc:smoke-alarm" }
Switch carbonMonoxideAlarm "carbon monoxide alarm" { channel="insteon:device:home:aabbcc:carbon-monoxide-alarm" }
Switch lowBattery          "low battery"           { channel="insteon:device:home:aabbcc:low-battery" }

# Sprinklers

The EZRain device controls up to 8 sprinkler valves and 4 programs. It can also enable pump control on the 8th valve. Only one sprinkler valve can be on at the time. When pump control is enabled, the 8th valve will remain on and cannot be controlled at the valve level. Each sprinkler program can be turned on/off by using PLAY and PAUSE commands. To skip forward or back to the next or previous valve in the program, use NEXT and PREVIOUS commands.

# Items
Switch valve1   "valve 1"   { channel="insteon:device:home:aabbcc:valve1" }
Switch valve2   "valve 2"   { channel="insteon:device:home:aabbcc:valve2" }
Switch valve3   "valve 3"   { channel="insteon:device:home:aabbcc:valve3" }
Switch valve4   "valve 4"   { channel="insteon:device:home:aabbcc:valve4" }
Switch valve5   "valve 5"   { channel="insteon:device:home:aabbcc:valve5" }
Switch valve6   "valve 6"   { channel="insteon:device:home:aabbcc:valve6" }
Switch valve7   "valve 7"   { channel="insteon:device:home:aabbcc:valve7" }
Switch valve8   "valve 8"   { channel="insteon:device:home:aabbcc:valve8" }
Switch pump     "pump"      { channel="insteon:device:home:aabbcc:pump" }
Player program1 "program 1" { channel="insteon:device:home:aabbcc:program1" }
Player program2 "program 2" { channel="insteon:device:home:aabbcc:program2" }
Player program3 "program 3" { channel="insteon:device:home:aabbcc:program3" }
Player program4 "program 4" { channel="insteon:device:home:aabbcc:program4" }

# Thermostats

The thermostat (2441TH) is one of the most complex Insteon devices available. To ensure all links are configured between the modem and device, and the status reporting is enabled, use the insteon device addMissingLinks console command.

# Items
Number:Temperature   thermostatCoolSetpoint "cool setpoint [%.1f °F]" { channel="insteon:device:home:aabbcc:cool-setpoint" }
Number:Temperature   thermostatHeatSetpoint "heat setpoint [%.1f °F]" { channel="insteon:device:home:aabbcc:heat-setpoint" }
String               thermostatSystemMode   "system mode [%s]"        { channel="insteon:device:home:aabbcc:system-mode" }
String               thermostatSystemState  "system state [%s]"       { channel="insteon:device:home:aabbcc:system-state" }
String               thermostatFanMode      "fan mode [%s]"           { channel="insteon:device:home:aabbcc:fan-mode" }
Number:Temperature   thermostatTemperature  "temperature [%.1f °F]"   { channel="insteon:device:home:aabbcc:temperature" }
Number:Dimensionless thermostatHumidity     "humidity [%.0f %%]"      { channel="insteon:device:home:aabbcc:humidity" }

Add this as well for some more exotic features:

Number:Time          thermostatACDelay            "A/C delay [%d min]"          { channel="insteon:device:home:aabbcc:ac-delay" }
Number:Time          thermostatBacklight          "backlight [%d sec]"          { channel="insteon:device:home:aabbcc:backlight-duration" }
Number:Time          thermostatStage1             "A/C stage 1 time [%d min]"   { channel="insteon:device:home:aabbcc:stage1-duration" }
Number:Dimensionless thermostatDehumidifySetpoint "dehumidify setpoint [%d %%]" { channel="insteon:device:home:aabbcc:dehumidify-setpoint" }
Number:Dimensionless thermostatHumidifySetpoint   "humidify setpoint [%d %%]"   { channel="insteon:device:home:aabbcc:humidify-setpoint" }
String               thermostatTemperatureScale   "temperature scale [%s]"      { channel="insteon:device:home:aabbcc:temperature-scale" }
String               thermostatTimeFormat         "time format [%s]"            { channel="insteon:device:home:aabbcc:time=format" }
Legacy
Number              thermostatCoolPoint   "cool point [%.1f °F]"      { channel="insteon:device:home:AABBCC:coolSetPoint" }
Number              thermostatHeatPoint   "heat point [%.1f °F]"      { channel="insteon:device:home:AABBCC:heatSetPoint" }
Number              thermostatSystemMode  "system mode [%d]"          { channel="insteon:device:home:AABBCC:systemMode" }
Number              thermostatFanMode     "fan mode [%d]"             { channel="insteon:device:home:AABBCC:fanMode" }
Number              thermostatIsHeating   "is heating [%d]"           { channel="insteon:device:home:AABBCC:isHeating"}
Number              thermostatIsCooling   "is cooling [%d]"           { channel="insteon:device:home:AABBCC:isCooling" }
Number:Temperature  thermostatTemperature "temperature [%.1f %unit%]" { channel="insteon:device:home:AABBCC:temperature" }
Number              thermostatHumidity    "humidity [%.0f %%]"        { channel="insteon:device:home:AABBCC:humidity" }

Add this as well for some more exotic features:

Number              thermostatACDelay      "A/C delay [%d min]"        { channel="insteon:device:home:AABBCC:acDelay" }
Number              thermostatBacklight    "backlight [%d sec]"        { channel="insteon:device:home:AABBCC:backlightDuration" }
Number              thermostatStage1       "A/C stage 1 time [%d min]" { channel="insteon:device:home:AABBCC:stage1Duration" }
Number              thermostatHumidityHigh "humidity high [%d %%]"     { channel="insteon:device:home:AABBCC:humidityHigh" }
Number              thermostatHumidityLow  "humidity low [%d %%]"      { channel="insteon:device:home:AABBCC:humidityLow" }
# Sitemap

For the thermostat to display in the GUI, add this to the sitemap file:

Text     item=thermostatTemperature icon="temperature"
Text     item=thermostatHumidity
Setpoint item=thermostatCoolPoint icon="temperature" minValue=63 maxValue=90 step=1
Setpoint item=thermostatHeatPoint icon="temperature" minValue=50 maxValue=80 step=1
Switch   item=thermostatSystemMode mappings=[ OFF="OFF", HEAT="HEAT", COOL="COOL", AUTO="AUTO", PROGRAM="PROGRAM" ]
Text     item=thermostatSystemState
Switch   item=thermostatFanMode mappings=[ AUTO="AUTO", ALWAYS_ON="ALWAYS ON" ]
Setpoint item=thermostatACDelay minValue=2 maxValue=20 step=1
Setpoint item=thermostatBacklight minValue=0 maxValue=100 step=1
Setpoint item=thermostatDehumidifySetpoint minValue=20 maxValue=90 step=1
Setpoint item=thermostatHumidifySetpoint  minValue=0 maxValue=79 step=1
Setpoint item=thermostatStage1 minValue=1 maxValue=60 step=1
Switch   item=thermostatTemperatureScale mappings=[ CELSIUS="CELSIUS", FAHRENHEIT="FAHRENHEIT" ]
Legacy
Text     item=thermostatTemperature icon="temperature"
Text     item=thermostatHumidity
Setpoint item=thermostatCoolPoint icon="temperature" minValue=63 maxValue=90 step=1
Setpoint item=thermostatHeatPoint icon="temperature" minValue=50 maxValue=80 step=1
Switch   item=thermostatSystemMode  label="system mode" mappings=[ 0="OFF",  1="HEAT", 2="COOL", 3="AUTO", 4="PROGRAM"]
Switch   item=thermostatFanMode  label="fan mode" mappings=[ 0="AUTO",  1="ALWAYS ON"]
Switch   item=thermostatIsHeating  label="is heating" mappings=[ 0="OFF",  1="HEATING"]
Switch   item=thermostatIsCooling  label="is cooling" mappings=[ 0="OFF",  1="COOLING"]
Setpoint item=thermostatACDelay  minValue=2 maxValue=20 step=1
Setpoint item=thermostatBacklight  minValue=0 maxValue=100 step=1
Setpoint item=thermostatHumidityHigh  minValue=0 maxValue=100 step=1
Setpoint item=thermostatHumidityLow   minValue=0 maxValue=100 step=1
Setpoint item=thermostatStage1  minValue=1 maxValue=60 step=1

# Window Coverings

Here is an example configuration for a micro open/close module (2444-222) in the .items file:

Rollershutter windowShade "window shade" { channel="insteon:device:home:aabbcc:rollershutter" }

Similar to dimmers, the binding uses the device on level and ramp rate local settings to set the rollershutter level, the same way it would be set when physically interacting with the controller, and can be overridden using the onLevel and rampRatechannel parameters.

# Insteon Scenes

The binding can trigger scenes by commanding the modem to send broadcasts to a given Insteon group.

# Things

Bridge insteon:plm:home [serialPort="/dev/ttyUSB0"] {
  Thing scene scene42 [group=42]
}

# Items

Switch scene                    "scene"         { channel="insteon:scene:home:scene42:scene" }
Switch sceneFastOnOff           "fast on/off"   { channel="insteon:scene:home:scene42:fast-on-off" }
Rollershutter sceneManualChange "manual change" { channel="insteon:scene:home:scene42:manual-change" }

# Sitemap

Switch item=scene
Switch item=sceneFastOnOff mappings=[ ON="ON", OFF="OFF" ]
Switch item=sceneManualChange mappings=[ UP="UP", DOWN="DOWN", STOP="STOP" ]

Sending ON command to scene will cause the modem to send a broadcast message to group 42, and all devices that are configured to respond to it should react. The current state of a scene is published on the scene channel. An ON state indicates that all the device states associated to a scene are matching their configured link on level.

Legacy

The binding can command the modem to send broadcasts to a given Insteon group. Since it is a broadcast message, the corresponding item does not take the address of any device, but of the modem itself. The format is broadcastOnOff#X where X is the group that you want to be able to broadcast messages to:

# Things

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC             [address="AA.BB.CC", productKey="0x000045"] {
    Channels:
      Type broadcastOnOff : broadcastOnOff#2
  }
}

Or setting the device configuration parameter with a JSON object with broadcastGroups key and the broadcast group array value:

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC             [address="AA.BB.CC", productKey="0x000045", deviceConfig="{'broadcastGroups': [2]}"]
}

# Items

Switch  broadcastOnOff "group on/off"  { channel="insteon:device:home:AABBCC:broadcastOnOff#2" }

Flipping this switch to "ON" will cause the modem to send a broadcast message with group=2, and all devices that are configured to respond to it should react.

# X10 Devices

It is worth noting that both the Insteon PLM and the 2014 Hub can both command X10 devices over the powerline, and also set switch stats based on X10 signals received over the powerline. This allows openHAB not only control X10 devices without the need for other hardware, but it can also have rules that react to incoming X10 powerline commands.

Note that X10 switches/dimmers send no status updates when toggled manually.

# Things

Bridge insteon:plm:home [serialPort="/dev/ttyUSB0"] {
  Thing x10 a2 [houseCode="A", unitCode=2, deviceType="X10_Switch"]
  Thing x10 b4 [houseCode="B", unitCode=4, deviceType="X10_Dimmer"]
  Thing x10 c6 [houseCode="C", unitCode=6, deviceType="X10_Sensor"]
}
Legacy
Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device A2 [address="A.2", productKey="X00.00.01"]
  Thing device B4 [address="B.4", productKey="X00.00.02"]
  Thing device C6 [address="C.6", productKey="X00.00.03"]
}

# Items

Switch  x10Switch "X10 switch" { channel="insteon:x10:home:a2:switch" }
Dimmer  x10Dimmer "X10 dimmer" { channel="insteon:x10:home:b4:dimmer" }
Contact x10Contact "X10 contact" { channel="insteon:x10:home:c6:contact" }

# Battery Powered Devices

Battery powered devices (mostly sensors) work differently than standard wired one. To conserve battery, these devices are only pollable when there are awake. Typically they send a heartbeat every 24 hours. When the binding receives a message from one of these devices, it polls additional information needed during the awake period (about 4 seconds). Some wireless devices have a stay-awake channel that can extend the period up to 4 minutes but at the cost of using more battery. It shouldn't be used in most cases except during initial device configuration. Same goes with commands, the binding will queue up commands requested on these devices and send them during the awake time window. Only one command per channel is queued, this mean that subsequent requests will overwrite previous ones.

# Heartbeat Timeout Monitor

Sensor devices that supports heartbeat have a timeout monitor. If no broadcast message is received within a specific interval, the associated thing status will go offline until the binding receives a broadcast message from that device. The heartbeat interval on most sensor devices is hard coded as 24 hours but some have the ability to change that interval through the heartbeat-interval channel. It is enabled by default on devices that supports that feature and will be disabled on devices that have the ability to turn off their heartbeat through the heartbeat-on-off channel. It is important that the heartbeat group (typically 4) is linked properly to the modem by using the insteon device addMissingLinks console command. Otherwise, if the link is missing, the timeout monitor will be disabled. If necessary, the heartbeat timeout monitor can be manually reset by disabling and re-enabling the associated device thing.

When an Insteon device changes its state because it is directly operated (for example by flipping a switch manually), it sends out a broadcast message to announce the state change, and the binding (if the PLM modem is properly linked as a responder) should update the corresponding openHAB items. Other linked devices however may also change their state in response, but those devices will not send out a broadcast message, and so openHAB will not learn about their state change until the next poll. One common scenario is e.g. a switch in a 3-way configuration, with one switch controlling the load, and the other switch being linked as a controller. In this scenario, when the binding receives a broadcast message from one of these devices indicating a state change, it will poll the other related devices shortly after, instead of waiting until the next scheduled device poll which can take minutes. It is important to note, that the binding will now automatically determine related devices, based on device link databases, deprecating the related channel parameter. Likewise, the related devices from triggered button events will be polled as well. For scenes, these will be polled based on the modem database, after sending a group broadcast message.

Legacy

The related channel parameter can be used to have the binding poll a related device whenever a state change occurs for another device. A typical example would be two dimmers (A and B) in a 3-way configuration:

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC [address="AA.BB.CC", productKey="F00.00.11"] {
    Channels:
      Type dimmer : dimmer [related="AA.BB.DD"]
  }
  Thing device AABBDD [address="AA.BB.DD", productKey="F00.00.11"] {
    Channels:
      Type dimmer : dimmer [related="AA.BB.CC"]
  }
}

The binding doesn't know which devices have responded to the message since its a broadcast message. The related channel parameter can be used to have the binding poll one or more related device when group message are sent. More than one device can be polled by separating them with + sign. A typical example would be a switch configured to broadcast to a group, and one or more devices configured to respond to the message:

Bridge insteon:network:home [port="/dev/ttyUSB0"] {
  Thing device AABBCC [address="AA.BB.CC", productKey="0x000045"] {
    Channels:
      Type broadcastOnOff : broadcastOnOff#3 [related="AA.BB.DD+AA.BB.EE"]
  }
  Thing device AABBDD [address="AA.BB.DD", productKey="F00.00.11"]
  Thing device AABBEE [address="AA.BB.EE", productKey="F00.00.11"]
}

# Triggered Events

In order to monitor if an Insteon device button was directly operated and the type of interaction, triggered event channels can be used. These channels have the sole purpose to be used in rules in order to set off subsequent actions based on these events. Below are examples, including all available events, of a dimmer button and a keypad button:

rule "Dimmer Paddle Events"
when
  Channel 'insteon:device:home:dimmer:event-button' triggered
then
  switch receivedEvent {
    case PRESSED_ON:         // do something (regular on)
    case PRESSED_OFF:        // do something (regular off)
    case DOUBLE_PRESSED_ON:  // do something (fast on)
    case DOUBLE_PRESSED_OFF: // do something (fast off)
    case HELD_UP:            // do something (manual change up)
    case HELD_DOWN:          // do something (manual change down)
    case RELEASED:           // do something (manual change stop)
  }
end

rule "Keypad Button A Pressed Off"
when
  Channel 'insteon:device:home:keypad:event-button-a' triggered PRESSED_OFF
then
  // do something
end

# Migration Guide

Here are the recommended steps to follow when migrating from the legacy implementation:

  • Create a new bridge matching your modem type. This will automatically disable the legacy network bridge with the same configuration to prevent having two bridges connected to the same modem.

  • Once your devices are discovered, they will show in your inbox.

    • Add the discovered things.
    • Connect the new things to your existing semantic models.
    • Link the new channels to your existing items.
    • Update your relevant rules.
  • For battery powered devices, press on their SET button to speed up the discovery process. Otherwise you may have to wait until the next time these devices send a heartbeat message which can take up to 24 hours.

  • For scenes, you can either enable scene discovery and add the discovered things, or just manually add specific scene things based on your existing environment. Enabling scene discovery might generate a considerable amount of things in your inbox depending on the number of scenes configured in your modem.

  • If you have rules to send commands to synchronize the state between related devices, you can enable the device synchronization feature on the bridge instead. This will synchronize related devices automatically based on their all-link database.

  • If you need to re-enable the legacy bridge, simply disable the new bridge and enable the legacy one again.

  • Once you finished updating your environment, you can remove the legacy bridge and things, which may need to be forced deleted since their bridge would be disabled.

# Troubleshooting

Turn on DEBUG or TRACE logging for org.openhab.binding.insteon. See logging in openHAB (opens new window) for more info.

# Debug Console Commands

To log message events between a device and the modem to a file:

# Single device monitor
openhab> insteon debug startMonitoring AA.BB.CC
# All devices monitor
openhab> insteon debug startMonitoring --all

To send a message to a device or broadcast group:

# Standard message to a device
openhab> insteon debug sendStandardMessage AA.BB.CC 11 FF
# Broadcast message to a group
openhab> insteon debug sendBroadcastMessage 42 13 00

# Device Permissions / Linux Device Locks

When openHAB is running as a non-root user (Linux/OSX) it is important to ensure it has write access not just to the PLM device, but to the os lock directory. Under openSUSE this is /run/lock and is managed by the lock group.

Example commands to grant openHAB access, depending on Linux distribution:

usermod -a -G dialout openhab
usermod -a -G lock openhab

Insufficient access to the lock directory will result in openHAB failing to access the device, even if the device itself is writable.

# Legacy Device Customization

# Adding New Legacy Device Types (Using Existing Device Features)

Device types are defined in the file legacy-device-types.xml, which is inside the Insteon bundle and thus not visible to the user. You can however load your own device_types.xml by referencing it in the network config parameters:

additionalDevices="/usr/local/openhab/rt/my-own-devices.xml"

Where the my-own-devices.xml file defines a new device like this:

<xml>
  <device productKey="F00.00.XX">
    <model>2456-D3</model>
    <description>LampLinc V2</description>
    <feature name="dimmer">GenericDimmer</feature>
    <feature name="lastheardfrom">GenericLastTime</feature>
  </device>
</xml>

Finding the Insteon product key can be tricky since Insteon has not updated the product key table (https://www.insteon.com/pdf/insteon_devcats_and_product_keys_20081008.pdf (opens new window)) since 2008. If a web search does not turn up the product key, make one up, starting with "F", like: F00.00.99. Avoid duplicate keys by finding the highest fake product key in the legacy-device-types.xml file, and incrementing by one.

# Adding New Legacy Device Features

If you can't build a new device out of the existing device features (for a complete list see legacy-device-features.xml) you can add new features by specifying a file (let's call it my-own-features.xml) with the "additionalDevices" option in the network config parameters:

additionalFeatures="/usr/local/openhab/rt/my-own-features.xml"

In this file you can define your own features (or even overwrite an existing feature). In the example below a new feature "MyFeature" is defined, which can then be referenced from the legacy-device-types.xml file (or from my-own-devices.xml):

<xml>
  <feature name="MyFeature">
    <message-dispatcher>DefaultDispatcher</message-dispatcher>
    <message-handler cmd="0x03">NoOpMsgHandler</message-handler>
    <message-handler cmd="0x06">NoOpMsgHandler</message-handler>
    <message-handler cmd="0x11">NoOpMsgHandler</message-handler>
    <message-handler cmd="0x13">NoOpMsgHandler</message-handler>
    <message-handler cmd="0x19">LightStateSwitchHandler</message-handler>
    <command-handler command="OnOffType">IOLincOnOffCommandHandler</command-handler>
    <poll-handler>DefaultPollHandler</poll-handler>
  </feature>
</xml>

# Known Limitations and Issues