Hayward Omnilogic Pool Automation Binding

Found a bug. Copy this into your add-ons folder and reboot.

https://drive.google.com/file/d/1OIFLjPT_uD_0CD4SlwCNZJTwouAs8r8e/view?usp=sharing

Thanks, it’s working!

Sorry one other thing, a request: would it be possible to add a filterSpeedRPM channel? You can do get/set on this as a percentage of Max-Pump-RPM.

Also I suggest adding state options for the speed channels, which will automatically become UI actions! Off/Low/Medium/High would be good choices to offer, for parity with Hayward’s app.

FYI, I opened tickets for those two feature requests so they don’t get lost. They’re both pretty straightforward and I’m happy to submit a PR if you’d like:

Greetings, I’ve learned a bunch by looking through this thread, and I thought I’d post my issue here rather than starting a new one, due to the recent activity.

I recently installed the Hayward Omnilogic Binding on my system (Ubuntu server running OH 3.1.0 Release). My issue is that not all of the things are being created automatically and I am not sure how to do a “partial” .thing file for the things (pumps, heater, etc.) that aren’t showing up. I’ve enabled trace logging as discussed above and have the following for my getTelemetry output (line breaks added by me for ease of reading):

14:33:15.455 [TRACE] [internal.handler.HaywardBridgeHandler] - 
Hayward Connection thing:  getTelemetryData 
Hayward http response: OK 
<STATUS version="1.0">
<Backyard systemId="116XXX" statusVersion="8" airTemp="96" status="1" state="1" configUpdatedTime="2021-08-09T03:33:12.094Z" datetime="2021-08-10T14:33:15.5169384" />
<BodyOfWater systemId="1" flow="1" waterTemp="91" />
<Filter systemId="3" valvePosition="1" filterSpeed="100" filterState="1" lastSpeed="50" />
<VirtualHeater systemId="4" Current-Set-Point="81" enable="no" />
<Heater systemId="5" heaterState="0" enable="yes" />
<Chlorinator systemId="6" operatingMode="1" Timed-Percent="55" scMode="0" chlrError="0" chlrAlert="0" avgSaltLevel="3176" instantSaltLevel="3076" status="68" />
<Pump systemId="9" pumpState="0" pumpSpeed="0" lastSpeed="48" />
<ColorLogic-Light systemId="8" lightState="0" currentShow="3" />
<CSAD systemId="0" ph="" orp="" status="0" mode="0" />
<BodyOfWater systemId="2" flow="1" waterTemp="-1" />
<Filter systemId="11" valvePosition="1" filterSpeed="0" filterState="0" lastSpeed="100" />
<VirtualHeater systemId="12" Current-Set-Point="98" enable="no" />
<Heater systemId="13" heaterState="0" enable="yes" />
<Chlorinator systemId="14" operatingMode="1" Timed-Percent="6" scMode="0" chlrError="0" chlrAlert="0" avgSaltLevel="0" instantSaltLevel="0" status="0" />
<Pump systemId="16" pumpState="0" pumpSpeed="0" lastSpeed="100" />
<CSAD systemId="0" ph="" orp="" status="0" mode="0" />
<Group systemId="29" groupState="0" />
</STATUS>

This looks to me like all of the devices/options that my system has (if I’m inferring how the omnilogic/binding/api actually implements having a 3-way valve and one pump that operates both pool/spa modes, and similarly for the heater…). The problem is, several of these items are not turned into things. Here is a screenshot of the things that are auto generated:

So the things I am missing are:
#4 BOW1 Virtual Heater
#5 BOW1 Heater
#9 BOW1 Pump (I think this is my water feature pump)
#0 BOW1 CSAD (guessing this is equipment I don’t have, and it’s listed twice)
#12 BOW2 Virtual Heater
#13 BOW2 Heater
#16 BOW2 Pump (I think this is my spa jets pump)
#0 (second time this is listed)
#29 Group (from other research I think this is a scene that’s programed, but not yet handled by the API/binding?)

Any idea why these things aren’t being generated by the binding, or any manual way that I can get access to them? Thank you!

If you don’t mind submitting the PR, go for it.

Can you please post your getMspConfig response. You are the first to run this code on multiple bodies of water. I suspect I overlooked something related to this. Also, since I don’t have a CSAD, I have not implemented support for that. With your logs, I can look into this. Some screen shots of the CSAD controls in the hayward application would be helpful as well.

Thanks,
Matt

Great! I’m happy to help! Here is the getMspConfig response. I ran it through an online “pretty xml” tool, but it still isn’t that pretty.

2021-08-10 11:03:27.200 [TRACE] [nternal.handler.HaywardBridgeHandler] - Hayward Connection thing:  getMspConfig Hayward http response: OK <Response><MSPConfig><System><Msp-Vsp-Speed-Format>Percent</Msp-Vsp-Speed-Format><Msp-Time-Format>12 Hour Format</Msp-Time-Format><Units>Standard</Units><Msp-Chlor-Display>Salt</Msp-Chlor-Display><Msp-Language>English</Msp-Language><UI-Display-Mode>standard</UI-Display-Mode><UI-MoodColor-Enabled>Yes</UI-MoodColor-Enabled><UI-Heater-SimpleMode>Yes</UI-Heater-SimpleMode><UI-Filter-SimpleMode>Yes</UI-Filter-SimpleMode><UI-Lights-SimpleMode>Yes</UI-Lights-SimpleMode></System><Backyard>
        MSP Configuration
        <System-Id>0</System-Id><Name>Backyard</Name><Service-Mode-Timeout>0</Service-Mode-Timeout><Sensor><System-Id>17</System-Id><Name>AirSensor</Name><Type>SENSOR_AIR_TEMP</Type><Units>UNITS_FAHRENHEIT</Units></Sensor><Body-of-water>
            01
            <System-Id>1</System-Id><Name>Pool</Name><Type>BOW_POOL</Type><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Shared-Priority>SHARED_EQUIPMENT_LOW_PRIORITY</Shared-Priority><Shared-Equipment-System-ID>2</Shared-Equipment-System-ID><Supports-Spillover>no</Supports-Spillover><Size-In-Gallons>0</Size-In-Gallons><Filter><System-Id>3</System-Id><Name>Filter Pump</Name><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Filter-Type>FMT_VARIABLE_SPEED_PUMP</Filter-Type><Max-Pump-Speed>100</Max-Pump-Speed><Min-Pump-Speed>50</Min-Pump-Speed><Max-Pump-RPM>3450</Max-Pump-RPM><Min-Pump-RPM>1725</Min-Pump-RPM><Priming-Enabled>no</Priming-Enabled><Vsp-Low-Pump-Speed>50</Vsp-Low-Pump-Speed><Vsp-Medium-Pump-Speed>75</Vsp-Medium-Pump-Speed><Vsp-High-Pump-Speed>100</Vsp-High-Pump-Speed><Vsp-Custom-Pump-Speed>100</Vsp-Custom-Pump-Speed><Freeze-Protect-Override-Interval>7200</Freeze-Protect-Override-Interval></Filter><Heater><System-Id>4</System-Id><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Enabled>no</Enabled><Current-Set-Point>81</Current-Set-Point><Max-Water-Temp>104</Max-Water-Temp><Min-Settable-Water-Temp>55</Min-Settable-Water-Temp><Max-Settable-Water-Temp>104</Max-Settable-Water-Temp><Operation>
                    PEO_HEATER_EQUIPMENT
                    <Heater-Equipment><System-Id>5</System-Id><Name>HEATER</Name><Type>PET_HEATER</Type><Heater-Type>HTR_GAS</Heater-Type><Enabled>yes</Enabled><Priority>HTR_PRIORITY_1</Priority><Run-For-Priority>HTR_MAINTAINS_PRIORITY_FOR_AS_LONG_AS_VALID</Run-For-Priority><Shared-Equipment-System-ID>13</Shared-Equipment-System-ID></Heater-Equipment></Operation></Heater><Chlorinator><System-Id>6</System-Id><Name>Chlorinator</Name><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Enabled>yes</Enabled><Mode>CHLOR_OP_MODE_TIMED</Mode><Timed-Percent>55</Timed-Percent><SuperChlor-Timeout>24</SuperChlor-Timeout><Cell-Type>CELL_TYPE_T15</Cell-Type><Dispenser-Type>SALT_DISPENSING</Dispenser-Type><Operation>
                    PEO_CHLORINATOR_EQUIPMENT
                    <Chlorinator-Equipment><System-Id>7</System-Id><Name>Chlorinator1</Name><Type>PET_CHLORINATOR</Type><Chlorinator-Type>CHLOR_TYPE_MAIN_PANEL</Chlorinator-Type><Enabled>yes</Enabled></Chlorinator-Equipment></Operation></Chlorinator><ColorLogic-Light><System-Id>8</System-Id><Name>LIGHTS</Name><Type>COLOR_LOGIC_UCL</Type></ColorLogic-Light><Pump><System-Id>9</System-Id><Name>FOUNTAINS</Name><Type>PMP_VARIABLE_SPEED_PUMP</Type><Function>PMP_LAMINARS</Function><Priming-Enabled>no</Priming-Enabled><Max-Pump-RPM>2500</Max-Pump-RPM><Min-Pump-RPM>1200</Min-Pump-RPM><Min-Pump-Speed>48</Min-Pump-Speed><Max-Pump-Speed>75</Max-Pump-Speed><Vsp-Medium-Pump-Speed>50</Vsp-Medium-Pump-Speed><Vsp-Custom-Pump-Speed>48</Vsp-Custom-Pump-Speed><Vsp-High-Pump-Speed>75</Vsp-High-Pump-Speed><Vsp-Low-Pump-Speed>48</Vsp-Low-Pump-Speed></Pump><Sensor><System-Id>18</System-Id><Name>WaterSensor</Name><Type>SENSOR_WATER_TEMP</Type><Units>UNITS_FAHRENHEIT</Units></Sensor><Sensor><System-Id>20</System-Id><Name>FlowSensor</Name><Type>SENSOR_FLOW</Type><Units>UNITS_ACTIVE_INACTIVE</Units></Sensor></Body-of-water><Body-of-water>
            02
            <System-Id>2</System-Id><Name>Spa</Name><Type>BOW_SPA</Type><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Shared-Priority>SHARED_EQUIPMENT_HIGH_PRIORITY</Shared-Priority><Shared-Equipment-System-ID>1</Shared-Equipment-System-ID><Supports-Spillover>no</Supports-Spillover><Size-In-Gallons>0</Size-In-Gallons><Filter><System-Id>11</System-Id><Name>Filter Pump</Name><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Filter-Type>FMT_VARIABLE_SPEED_PUMP</Filter-Type><Max-Pump-Speed>100</Max-Pump-Speed><Min-Pump-Speed>50</Min-Pump-Speed><Max-Pump-RPM>3450</Max-Pump-RPM><Min-Pump-RPM>1725</Min-Pump-RPM><Priming-Enabled>no</Priming-Enabled><Vsp-Low-Pump-Speed>50</Vsp-Low-Pump-Speed><Vsp-Medium-Pump-Speed>75</Vsp-Medium-Pump-Speed><Vsp-High-Pump-Speed>100</Vsp-High-Pump-Speed><Vsp-Custom-Pump-Speed>100</Vsp-Custom-Pump-Speed><Freeze-Protect-Override-Interval>7200</Freeze-Protect-Override-Interval></Filter><Heater><System-Id>12</System-Id><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Enabled>no</Enabled><Current-Set-Point>98</Current-Set-Point><SolarSetPoint>98</SolarSetPoint><Max-Water-Temp>104</Max-Water-Temp><Min-Settable-Water-Temp>55</Min-Settable-Water-Temp><Max-Settable-Water-Temp>104</Max-Settable-Water-Temp><Operation>
                    PEO_HEATER_EQUIPMENT
                    <Heater-Equipment><System-Id>13</System-Id><Name>HEATER</Name><Type>PET_HEATER</Type><Heater-Type>HTR_GAS</Heater-Type><Enabled>yes</Enabled><Priority>HTR_PRIORITY_1</Priority><Run-For-Priority>HTR_MAINTAINS_PRIORITY_FOR_AS_LONG_AS_VALID</Run-For-Priority><Shared-Equipment-System-ID>5</Shared-Equipment-System-ID></Heater-Equipment></Operation></Heater><Chlorinator><System-Id>14</System-Id><Name>Chlorinator</Name><Shared-Type>BOW_SHARED_EQUIPMENT</Shared-Type><Enabled>yes</Enabled><Mode>CHLOR_OP_MODE_TIMED</Mode><Timed-Percent>6</Timed-Percent><SuperChlor-Timeout>24</SuperChlor-Timeout><Cell-Type>CELL_TYPE_T15</Cell-Type><Dispenser-Type>SALT_DISPENSING</Dispenser-Type><Operation>
                    PEO_CHLORINATOR_EQUIPMENT
                    <Chlorinator-Equipment><System-Id>15</System-Id><Name>Chlorinator1</Name><Type>PET_CHLORINATOR</Type><Chlorinator-Type>CHLOR_TYPE_MAIN_PANEL</Chlorinator-Type><Enabled>yes</Enabled></Chlorinator-Equipment></Operation></Chlorinator><Pump><System-Id>16</System-Id><Name>SPA JETS</Name><Type>PMP_SINGLE_SPEED</Type><Function>PMP_LAMINARS</Function><Priming-Enabled>no</Priming-Enabled><Max-Pump-RPM>3450</Max-Pump-RPM><Min-Pump-RPM>600</Min-Pump-RPM><Min-Pump-Speed>18</Min-Pump-Speed><Max-Pump-Speed>100</Max-Pump-Speed><Vsp-Medium-Pump-Speed>100</Vsp-Medium-Pump-Speed><Vsp-Custom-Pump-Speed>100</Vsp-Custom-Pump-Speed><Vsp-High-Pump-Speed>100</Vsp-High-Pump-Speed><Vsp-Low-Pump-Speed>100</Vsp-Low-Pump-Speed></Pump><Sensor><System-Id>19</System-Id><Name>WaterSensor</Name><Type>SENSOR_WATER_TEMP</Type><Units>UNITS_FAHRENHEIT</Units></Sensor><Sensor><System-Id>21</System-Id><Name>FlowSensor</Name><Type>SENSOR_FLOW</Type><Units>UNITS_ACTIVE_INACTIVE</Units></Sensor></Body-of-water></Backyard><Schedules><sche><bow-system-id>1</bow-system-id><equipment-id>3</equipment-id><schedule-system-id>23</schedule-system-id><event>164</event><data>100</data><enabled>1</enabled><start-minute>31</start-minute><start-hour>8</start-hour><end-minute>30</end-minute><end-hour>21</end-hour><days-active>127</days-active><recurring>1</recurring></sche><sche><bow-system-id>1</bow-system-id><equipment-id>8</equipment-id><schedule-system-id>24</schedule-system-id><event>164</event><data>3</data><enabled>1</enabled><start-minute>30</start-minute><start-hour>19</start-hour><end-minute>30</end-minute><end-hour>21</end-hour><days-active>127</days-active><recurring>1</recurring></sche><sche><bow-system-id>1</bow-system-id><equipment-id>3</equipment-id><schedule-system-id>25</schedule-system-id><event>164</event><data>50</data><enabled>1</enabled><start-minute>31</start-minute><start-hour>21</start-hour><end-minute>30</end-minute><end-hour>8</end-hour><days-active>127</days-active><recurring>1</recurring></sche><sche><bow-system-id>1</bow-system-id><equipment-id>9</equipment-id><schedule-system-id>26</schedule-system-id><event>164</event><data>48</data><enabled>1</enabled><start-minute>0</start-minute><start-hour>21</start-hour><end-minute>3</end-minute><end-hour>21</end-hour><days-active>127</days-active><recurring>1</recurring></sche><sche><bow-system-id>2</bow-system-id><equipment-id>16</equipment-id><schedule-system-id>30</schedule-system-id><event>164</event><data>100</data><enabled>1</enabled><start-minute>56</start-minute><start-hour>20</start-hour><end-minute>59</end-minute><end-hour>20</end-hour><days-active>127</days-active><recurring>1</recurring></sche></Schedules><Favorites><Favorite><System-Id>28</System-Id><Index-Id>1</Index-Id><EquipmentID-Or-ThemeID>9</EquipmentID-Or-ThemeID><Sequence>0</Sequence><Data>0</Data><SimpleModeEnabled>1</SimpleModeEnabled></Favorite></Favorites><Groups><Group><System-Id>29</System-Id><Name>Party Mode</Name><Icon-Id>8</Icon-Id><countdown-timer>7200</countdown-timer><Request><Name>TurnOnOffForGroup</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="EquipmentID" dataType="int">3</Parameter><Parameter name="Data" dataType="int">0</Parameter><Parameter name="LightState" dataType="int">0</Parameter></Parameters></Request><Request><Name>SetHeaterScheduleCmd</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="HeaterID" dataType="int">4</Parameter><Parameter name="Temp" dataType="int">82</Parameter><Parameter name="IsCountDownTimer" dataType="bool">0</Parameter><Parameter name="StartTimeHours" dataType="int">0</Parameter><Parameter name="StartTimeMinutes" dataType="int">0</Parameter><Parameter name="EndTimeHours" dataType="int">0</Parameter><Parameter name="EndTimeMinutes" dataType="int">0</Parameter><Parameter name="DaysActive" dataType="int">0</Parameter><Parameter name="Recurring" dataType="bool">0</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterPriorityCmd</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="HeaterID1" dataType="int">5</Parameter><Parameter name="HeaterID2" dataType="int">-1</Parameter><Parameter name="HeaterID3" dataType="int">-1</Parameter><Parameter name="HeaterID4" dataType="int">-1</Parameter><Parameter name="HeaterID5" dataType="int">-1</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterMaintainPriorityCmd</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="HeaterID" dataType="int">4</Parameter><Parameter name="Priority1MaintainFor" dataType="byte">24</Parameter><Parameter name="Priority2MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority3MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority4MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority5MaintainFor" dataType="byte">255</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterEnable</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="HeaterID" dataType="int">4</Parameter><Parameter name="Enabled" dataType="int">0</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterEnable</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="HeaterID" dataType="int">5</Parameter><Parameter name="Enabled" dataType="int">1</Parameter></Parameters></Request><Request><Name>SetUISuperCHLORCmd</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="EquipmentID" dataType="int">6</Parameter><Parameter name="IsOn" dataType="int">0</Parameter></Parameters></Request><Request><Name>TurnOnOffForGroup</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="EquipmentID" dataType="int">8</Parameter><Parameter name="Data" dataType="int">263171</Parameter><Parameter name="LightState" dataType="int">1</Parameter></Parameters></Request><Request><Name>TurnOnOffForGroup</Name><Parameters><Parameter name="PoolID" dataType="int">1</Parameter><Parameter name="EquipmentID" dataType="int">9</Parameter><Parameter name="Data" dataType="int">48</Parameter><Parameter name="LightState" dataType="int">0</Parameter></Parameters></Request><Request><Name>TurnOnOffForGroup</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="EquipmentID" dataType="int">11</Parameter><Parameter name="Data" dataType="int">100</Parameter><Parameter name="LightState" dataType="int">0</Parameter></Parameters></Request><Request><Name>SetHeaterScheduleCmd</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="HeaterID" dataType="int">12</Parameter><Parameter name="Temp" dataType="int">99</Parameter><Parameter name="IsCountDownTimer" dataType="bool">0</Parameter><Parameter name="StartTimeHours" dataType="int">0</Parameter><Parameter name="StartTimeMinutes" dataType="int">0</Parameter><Parameter name="EndTimeHours" dataType="int">0</Parameter><Parameter name="EndTimeMinutes" dataType="int">0</Parameter><Parameter name="DaysActive" dataType="int">0</Parameter><Parameter name="Recurring" dataType="bool">0</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterPriorityCmd</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="HeaterID1" dataType="int">13</Parameter><Parameter name="HeaterID2" dataType="int">-1</Parameter><Parameter name="HeaterID3" dataType="int">-1</Parameter><Parameter name="HeaterID4" dataType="int">-1</Parameter><Parameter name="HeaterID5" dataType="int">-1</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterMaintainPriorityCmd</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="HeaterID" dataType="int">12</Parameter><Parameter name="Priority1MaintainFor" dataType="byte">24</Parameter><Parameter name="Priority2MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority3MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority4MaintainFor" dataType="byte">255</Parameter><Parameter name="Priority5MaintainFor" dataType="byte">255</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterEnable</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="HeaterID" dataType="int">12</Parameter><Parameter name="Enabled" dataType="int">1</Parameter></Parameters></Request><Request><Name>SetUITemporaryHeaterEnable</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="HeaterID" dataType="int">13</Parameter><Parameter name="Enabled" dataType="int">1</Parameter></Parameters></Request><Request><Name>SetUISuperCHLORCmd</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="EquipmentID" dataType="int">14</Parameter><Parameter name="IsOn" dataType="int">0</Parameter></Parameters></Request><Request><Name>TurnOnOffForGroup</Name><Parameters><Parameter name="PoolID" dataType="int">2</Parameter><Parameter name="EquipmentID" dataType="int">16</Parameter><Parameter name="Data" dataType="int">0</Parameter><Parameter name="LightState" dataType="int">0</Parameter></Parameters></Request></Group></Groups><Terminals><Terminal><Name>Spa</Name><Type>TRM_SPA_SIDE_SIX_BUTTON</Type><Filter><System-Id>11</System-Id></Filter><Heater><System-Id>12</System-Id></Heater><Button><Button-Id>0</Button-Id><System-Id>16</System-Id><Button-CtrlType>CTRL_TYPE_EQUIP</Button-CtrlType></Button><Button><Button-Id>1</Button-Id><System-Id>28</System-Id><Button-CtrlType>CTRL_TYPE_FAVORITE</Button-CtrlType></Button><Button><Button-Id>2</Button-Id><System-Id>29</System-Id><Button-CtrlType>CTRL_TYPE_GROUP</Button-CtrlType></Button></Terminal></Terminals></MSPConfig><MSPAPI version="0.4" latestversion="0.4"><Device-APIs><API System-Id="29" OpType="ON_OFF" ref="RunGroupCmd" ThemeID="29" IsOn="API::STATUS::Group::groupState" /><API System-Id="3" OpType="ON_OFF" ref="SetUIEquipmentCmd" EquipmentID="3" IsOn="API::STATUS::Filter::filterSpeed" /><API System-Id="4" OpType="ON_OFF" ref="SetHeaterEnable" HeaterID="4" /><API System-Id="4" OpType="SETPOINT" ref="SetUIHeaterCmd" HeaterID="4" Temp="API::STATUS::VirtualHeater::Current-Set-Point" /><API System-Id="6" OpType="ON_OFF" ref="SetCHLOREnable" Enabled="API::CONFIG::Chlorinator::Enabled" /><API System-Id="6" OpType="CHL_PARAMETERS" ref="SetCHLORParams" ChlorID="6" OpMode="API::CONFIG::Chlorinator::Mode" CellType="API::CONFIG::Chlorinator::Cell-Type" TimedPercent="API::CONFIG::Chlorinator::Timed-Percent" SCTimeout="API::CONFIG::Chlorinator::SuperChlor-Timeout" ORPTimout="API::CONFIG::Chlorinator::ORPTimout" /><API System-Id="9" OpType="ON_OFF_SETPOINT" ref="SetUIEquipmentCmd" EquipmentID="9" IsOn="API::STATUS::Pump::pumpSpeed" /><API System-Id="8" OpType="ON_OFF" ref="SetUIEquipmentCmd" EquipmentID="8" IsOn="API::STATUS::ColorLogic-Light::lightState" /><API System-Id="8" OpType="ON_SETPOINT" ref="SetStandAloneLightShowV2" LightID="8" Show="API::STATUS::ColorLogic-Light::currentShow" Speed="API::STATUS::ColorLogic-Light::speed" Brightness="API::STATUS::ColorLogic-Light::brightness" /><API System-Id="0" OpType="CSAD_MODE" ref="UISetCSADMode" CSADID="0" Mode="API::STATUS::CSAD::mode" /><API System-Id="0" OpType="CSAD_CALIBRATION" ref="UISetCSADTargetValue" CSADID="0" Mode="API::STATUS::CSAD::ph" /><API System-Id="11" OpType="ON_OFF" ref="SetUIEquipmentCmd" EquipmentID="11" IsOn="API::STATUS::Filter::filterSpeed" /><API System-Id="12" OpType="ON_OFF" ref="SetHeaterEnable" HeaterID="12" /><API System-Id="12" OpType="SETPOINT" ref="SetUIHeaterCmd" HeaterID="12" Temp="API::STATUS::VirtualHeater::Current-Set-Point" /><API System-Id="14" OpType="ON_OFF" ref="SetCHLOREnable" Enabled="API::CONFIG::Chlorinator::Enabled" /><API System-Id="14" OpType="CHL_PARAMETERS" ref="SetCHLORParams" ChlorID="14" OpMode="API::CONFIG::Chlorinator::Mode" CellType="API::CONFIG::Chlorinator::Cell-Type" TimedPercent="API::CONFIG::Chlorinator::Timed-Percent" SCTimeout="API::CONFIG::Chlorinator::SuperChlor-Timeout" ORPTimout="API::CONFIG::Chlorinator::ORPTimout" /><API System-Id="16" OpType="ON_OFF_SETPOINT" ref="SetUIEquipmentCmd" EquipmentID="16" IsOn="API::STATUS::Pump::pumpSpeed" /><API System-Id="0" OpType="CSAD_MODE" ref="UISetCSADMode" CSADID="0" Mode="API::STATUS::CSAD::mode" /><API System-Id="0" OpType="CSAD_CALIBRATION" ref="UISetCSADTargetValue" CSADID="0" Mode="API::STATUS::CSAD::ph" /></Device-APIs><Favorite-APIs><API Favorite-Id="29" ref="RunGroupCmd" OpType="ON_OFF" ThemeID="29" IsOn="API::STATUS::Group::groupState" /><API Favorite-Id="3" ref="SetUIEquipmentCmd" OpType="ON_OFF" EquipmentID="3" IsOn="API::STATUS::Filter::filterState" /><API Favorite-Id="4" ref="API::GOTOFEATURE" /><API Favorite-Id="1" ref="SetHeaterEnable" HeaterID="4" /><API Favorite-Id="6" ref="SetCHLORParams" OpType="CHL_PARAMETERS" ChlorID="6" OpMode="API::CONFIG::Chlorinator::Mode" CellType="API::CONFIG::Chlorinator::Cell-Type" TimedPercent="API::CONFIG::Chlorinator::Timed-Percent" SCTimeout="API::CONFIG::Chlorinator::SuperChlor-Timeout" ORPTimout="API::CONFIG::Chlorinator::ORPTimout" /><API Favorite-Id="6" ref="API::GOTOFEATURE" /><API Favorite-Id="9" ref="SetUIEquipmentCmd" OpType="ON_OFF" EquipmentID="9" /><API Favorite-Id="9" ref="API::GOTOFEATURE" /><API Favorite-Id="8" ref="SetStandAloneLightShowV2" OpType="ON_SETPOINT" LightID="8" Show="API::CONFIG::Favorite::Data" Speed="API::CONFIG::Favorite::Data2" Brightness="API::CONFIG::Favorite::Data3" /><API Favorite-Id="0" ref="API::GOTOFEATURE" /><API Favorite-Id="11" ref="SetUIEquipmentCmd" OpType="ON_OFF" EquipmentID="11" IsOn="API::STATUS::Filter::filterState" /><API Favorite-Id="12" ref="API::GOTOFEATURE" /><API Favorite-Id="2" ref="SetHeaterEnable" HeaterID="12" /><API Favorite-Id="14" ref="SetCHLORParams" OpType="CHL_PARAMETERS" ChlorID="14" OpMode="API::CONFIG::Chlorinator::Mode" CellType="API::CONFIG::Chlorinator::Cell-Type" TimedPercent="API::CONFIG::Chlorinator::Timed-Percent" SCTimeout="API::CONFIG::Chlorinator::SuperChlor-Timeout" ORPTimout="API::CONFIG::Chlorinator::ORPTimout" /><API Favorite-Id="14" ref="API::GOTOFEATURE" /><API Favorite-Id="16" ref="SetUIEquipmentCmd" OpType="ON_OFF" EquipmentID="16" /><API Favorite-Id="0" ref="API::GOTOFEATURE" /></Favorite-APIs><Schedule-APIs><API System-Id="29" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="29" Data="1" ActionID="317" /><API System-Id="29" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="1" ActionID="317" /><API System-Id="29" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="3" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="3" Data="API::STATUS::Filter::filterSpeed" ActionID="164" /><API System-Id="3" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::Filter::filterSpeed" ActionID="164" /><API System-Id="3" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="4" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="4" Data="API::STATUS::VirtualHeater::Current-Set-Point" ActionID="315" /><API System-Id="4" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::VirtualHeater::Current-Set-Point" ActionID="315" /><API System-Id="4" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="6" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="6" Data="API::CONFIG::Chlorinator::Timed-Percent" ActionID="164" /><API System-Id="6" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::CONFIG::Chlorinator::Timed-Percent" ActionID="164" /><API System-Id="6" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="9" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="9" Data="API::STATUS::Pump::pumpSpeed" ActionID="164" /><API System-Id="9" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::Pump::pumpSpeed" ActionID="164" /><API System-Id="9" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="8" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleAltCmd" EquipmentID="8" Show="API::STATUS::ColorLogic-Light::currentShow" Speed="API::STATUS::ColorLogic-Light::speed" Brightness="API::STATUS::ColorLogic-Light::brightness" Data4="0" ActionID="308" /><API System-Id="8" OpType="EDIT_SCHEDULE" ref="EditUIScheduleAltCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Show="API::STATUS::ColorLogic-Light::currentShow" Speed="API::STATUS::ColorLogic-Light::speed" Brightness="API::STATUS::ColorLogic-Light::brightness" Data4="0" ActionID="308" /><API System-Id="8" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="11" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="11" Data="API::STATUS::Filter::filterSpeed" ActionID="164" /><API System-Id="11" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::Filter::filterSpeed" ActionID="164" /><API System-Id="11" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="12" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="12" Data="API::STATUS::VirtualHeater::Current-Set-Point" ActionID="315" /><API System-Id="12" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::VirtualHeater::Current-Set-Point" ActionID="315" /><API System-Id="12" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="14" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="14" Data="API::CONFIG::Chlorinator::Timed-Percent" ActionID="164" /><API System-Id="14" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::CONFIG::Chlorinator::Timed-Percent" ActionID="164" /><API System-Id="14" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /><API System-Id="16" OpType="CREATE_SCHEDULE" ref="CreateUIScheduleCmd" EquipmentID="16" Data="API::STATUS::Pump::pumpSpeed" ActionID="164" /><API System-Id="16" OpType="EDIT_SCHEDULE" ref="EditUIScheduleCmd" EquipmentID="API::CONFIG::sche::schedule-system-id" Data="API::STATUS::Pump::pumpSpeed" ActionID="164" /><API System-Id="16" OpType="REMOVE_SCHEDULE" ref="DeleteUIScheduleCmd" ScheduleSystemID="API::CONFIG::sche::schedule-system-id" /></Schedule-APIs></MSPAPI></Response>

I wish I knew more about the coding involved with actually making/testing a binding. I’m willing to learn if you need help or would like me to look at anything on my system.

My system has 3 total pumps. One is the main filter pump (variable speed) that has a 3 way valve on it and that’s what puts the system in pool mode vs. spa mode. Then there are 2 more pumps, one is a variable speed pump for the water feature in the pool (fountains) and a single speed pump for the spa jets. It is these last 2 pumps (along with some other things) that don’t seem to be showing up on the auto thing discovery in OpenHAB. Maybe the binding doesn’t know how to handle them yet?

I don’t think I actually have the CSAD equipment, but since my controller is capable of having it, it still shows up on the getTelemetry call. This is just a guess though, I am not actually sure what the CSAD is. Here is a snap of the Home Screen on the Hayward website, this is the pool tab. Note how all of the fields for the water quality are empty. I think this is the CSAD stuff?

Let me know what else you need! Thanks again!

Yep, that is the CSAD (Chemistry Sense and Dispense) also know as Hayward’s ORP system. I haven’t heard anything good about that equipment. I found and fixed the issue with your discovery. The hot tub terminal panel was the issue. This was the first time I’ve seen one of those in the data. You can download the jar here:

https://drive.google.com/file/d/1GIAtkhP2rSAZU9FBj43PaipCYI7asTOW/view?usp=sharing

and copy it into your add-ons folder. I will also need to look into how to control your pool/spa mode valve.

Thanks,
Matt

Scratch that version. I left some debug code in there. Use this one…

https://drive.google.com/file/d/1pClWjHo_IimH7M3boZ46IOJFbDcP7UZA/view?usp=sharing

I added the getApiDef call if the debug level is set to Trace. Send me the response which might give me a clue on how to change the pool/spa mode. I’m assuming you have a valve actuator.

https://drive.google.com/file/d/1Cpd9MIu22PGzJmvveV-rPPmcf-86rYl5/view?usp=sharing

@matchews, this is great. I will take a look as soon as I get home. I’m out of town for a few days so I’m unable to swap the binding .jar till I get back (hopefully by Wednesday evening). In the mean time I’ll try to figure out how to manually update the binding with the file you sent.

Thanks! Phil

I think the OmniLogic will switch pool/spa modes when you command the appropriate filter/pump to start. You have two virtual filter/pumps in your configuration. One for the pool, and one for the spa. Let me know if that works.

Thanks,
Matt

I installed the snapshot binding you sent and things are working a lot better. It now seems to break out all of my equipment, but I think there are still a few things not working quite right. The filter pumps (spa and pool, really just one valve, but broken out by the API into two separate virtual devices) work like you said they should. Turning one ON will turn the other one OFF and the status strings will reflect the correct mode (pool vs. spa). However I’m not sure that the other “feature” pumps are being parsed or “bound” correctly. For my pool fountains the getTelemetery call returns:

<Pump systemId="9" pumpState="0" pumpSpeed="0" lastSpeed="100" />

This is a variable speed pump, and I would expect to see pump related channels, but this is what the binding auto-generates for channels:

Similarly for my Spa jets the getTelemetery call returns:

<Pump systemId="16" pumpState="0" pumpSpeed="0" lastSpeed="100" />

This is a single speed pump, and the binding generates the following channels for it:

For a while none of these channels would work. But for some reason the “filterEnable” channel works for turning each respective pump on and off, but that is the only channel that I can link to an item and get it to work. The rest of the channels are null.

Thank you so much for your efforts on this binding, please let me know what other information you may need!

Phil

Found a typo. Try this one. You will have to delete both pumps, rescan and re-add them. For the single speed pump, just ignore the speed channels. Thanks for the feedback. You are the first one utilizing the pump things as well.

https://drive.google.com/file/d/1_j6m3jqYWSUgAAWi7eN3DRau20TEdP64/view?usp=sharing

Nice, will try it tonight and get back to you ASAP.

BTW, can you confirm that I must restart OH after removing the old .jar and replacing this one?
And, a follow on, if I want to at some point start using the release version of the binding, that is available in the UI, how do I revert to that?

Thank you!

@matchews, I deleted the two pump things, installed the new .jar (to answer my own question it appears all you have to do is copy it into the folder and it re-loads it), and did a reboot of the system. I then scanned and added the new pump things, which now had the “:pump:” annotation and the correct channels for the pump. However, there is a problem somewhere. The HaywardHandlerFactory could not create a handler for the thing… and the thing stays at “Uninitialized”. I deleted the things, re-scanned, and had the same result a second time. Here is the error from the log:


22:35:33.716 [INFO ] [hab.event.ThingStatusInfoChangedEvent] - Thing 'haywardomnilogic:pump:cce74df826:9' changed from UNINITIALIZED to UNINITIALIZED (HANDLER_REGISTERING_ERROR): HaywardHandlerFactory could not create a handler for the thing 'haywardomnilogic:pump:cce74df826:9'.
22:35:33.720 [ERROR] [.core.thing.internal.ThingManagerImpl] - Exception occurred while calling thing handler factory 'org.openhab.binding.haywardomnilogic.internal.HaywardHandlerFactory@a4ab26e': HaywardHandlerFactory could not create a handler for the thing 'haywardomnilogic:pump:cce74df826:9'.
java.lang.IllegalStateException: HaywardHandlerFactory could not create a handler for the thing 'haywardomnilogic:pump:cce74df826:9'.
        at org.openhab.core.thing.binding.BaseThingHandlerFactory.registerHandler(BaseThingHandlerFactory.java:131) ~[?:?]
        at org.openhab.core.thing.internal.ThingManagerImpl.doRegisterHandler(ThingManagerImpl.java:670) ~[?:?]
        at org.openhab.core.thing.internal.ThingManagerImpl.registerHandler(ThingManagerImpl.java:651) ~[?:?]
        at org.openhab.core.thing.internal.ThingManagerImpl.registerAndInitializeHandler(ThingManagerImpl.java:1116) ~[?:?]
        at org.openhab.core.thing.internal.ThingManagerImpl.thingAdded(ThingManagerImpl.java:520) ~[?:?]
        at org.openhab.core.thing.internal.ThingRegistryImpl.notifyTrackers(ThingRegistryImpl.java:212) ~[?:?]
        at org.openhab.core.thing.internal.ThingRegistryImpl.notifyListenersAboutAddedElement(ThingRegistryImpl.java:132) ~[?:?]
        at org.openhab.core.thing.internal.ThingRegistryImpl.notifyListenersAboutAddedElement(ThingRegistryImpl.java:1) ~[?:?]
        at org.openhab.core.common.registry.AbstractRegistry.added(AbstractRegistry.java:175) ~[?:?]
        at org.openhab.core.common.registry.AbstractRegistry.added(AbstractRegistry.java:1) ~[?:?]
        at org.openhab.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:60) ~[?:?]
        at org.openhab.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:79) ~[?:?]
        at org.openhab.core.common.registry.AbstractProvider.notifyListenersAboutAddedElement(AbstractProvider.java:83) ~[?:?]
        at org.openhab.core.common.registry.AbstractManagedProvider.add(AbstractManagedProvider.java:67) ~[?:?]
        at org.openhab.core.common.registry.AbstractRegistry.add(AbstractRegistry.java:346) ~[?:?]
        at org.openhab.core.config.discovery.internal.PersistentInbox.addThingSafely(PersistentInbox.java:596) ~[?:?]
        at org.openhab.core.config.discovery.internal.PersistentInbox.approve(PersistentInbox.java:218) ~[?:?]
        at org.openhab.core.io.rest.core.internal.discovery.InboxResource.approve(InboxResource.java:120) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179) ~[bundleFile:3.4.3]
        at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) ~[bundleFile:3.4.3]
        at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201) ~[bundleFile:3.4.3]
        at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104) ~[bundleFile:3.4.3]
        at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) ~[bundleFile:3.4.3]
        at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) ~[bundleFile:3.4.3]
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:298) ~[bundleFile:3.4.3]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217) ~[bundleFile:3.4.3]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[bundleFile:3.1.0]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:273) ~[bundleFile:3.4.3]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:791) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) ~[bundleFile:9.4.40.v20210413]
        at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71) ~[bundleFile:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435) ~[bundleFile:9.4.40.v20210413]
        at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:294) ~[bundleFile:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[bundleFile:9.4.40.v20210413]
        at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:82) ~[bundleFile:?]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388) ~[bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882) [bundleFile:9.4.40.v20210413]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036) [bundleFile:9.4.40.v20210413]
        at java.lang.Thread.run(Thread.java:829) [?:?]

Sorry it’s causing trouble, but hope this is helpful in sorting out the binding!

Did it create things for both the single speed and variable speed pump? Try deleting everything and recreating the bridge, etc.

Never mind. The pump handler was missing. Should be fixed here.

https://drive.google.com/file/d/1mr8hSMsn9r9dEnjjzibajmIzwb-I3NKm/view?usp=sharing