BRT-100 Thermostat via MQTT

Platform information: Openhab 3.3 Stable, Raspberry Pi 4, ZigBee2MQTT 1.97.0 with 94 devices
due to the energy saving initiative i ordered 8 MOES BRT-100 Thermostats and i trying to get them into Openhab via Zigbee2MQTT to get control of them.

My Things Config looks like this:
Thing topic Bad_Thermostat “Bad Thermostat” {

Thing topic Bad_Thermostat "Bad Thermostat" {
    //MOES BRT 100 TRV
        Type switch : Bad_Thermostat_child_lock "Bad Thermostat Child Lock" [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.child_lock", formatBeforePublish = "{\"child_lock\" : \"%s\"}", off = "UNLOCK", on = "LOCK"]
        Type number : Bad_Thermostat_current_heating_setpoint "Bad Thermostat Zieltemperatur" [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.current_heating_setpoint", formatBeforePublish = "{\"current_heating_setpoint\" : \"%s\"}", min = 14, max = 26, unit = "°C", step = 0.5]
        Type switch : Bad_Thermostat_eco_mode "Bad Thermostat Eco Mode" [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.eco_mode", formatBeforePublish = "{\"eco_mode\" : \"%s\"}"]
        Type number : Bad_Thermostat_eco_temperature "Bad Thermostat Eco Temperatur" [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.eco_temperature", formatBeforePublish = "{\"eco_temperature\" : \"%s\"}", min = 12, max =20, unit = "°C"]
        Type number : Bad_Thermostat_local_temperature "Bad Thermostat Aktuelle Temperatur" [stateTopic = "zigbee2mqtt/Bad_Thermostat", transformationPattern = "JSONPATH:$.local_temperature", unit = "°C"]
        Type number : Bad_Thermostat_max_temperature "Bad Thermostat Max Temperatur" [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.max_temperature", formatBeforePublish = "{\"max_temperature\" : \"%s\"}", min = 15, max = 35, unit = "°C", step = 1]
        Type string : Bad_Thermostat_preset  "Bad Thermostat Modus"  [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.preset", formatBeforePublish = "{\"preset\" : \"%s\"}", allowedStates = "manual, programming, temporary_manual, holiday"]
        Type string : Bad_Thermostat_programming_mode  "Bad Thermostat Program"  [stateTopic = "zigbee2mqtt/Bad_Thermostat", commandTopic = "zigbee2mqtt/Bad_Thermostat/set", transformationPattern = "JSONPATH:$.programming_mode", formatBeforePublish = "{\"programming_mode\" : \"%s\"}"]
        Type contact : Bad_Thermostat_valve_state "Bad Thermostat Ventilstatus" [stateTopic = "zigbee2mqtt/Bad_Thermostat", transformationPattern = "JSONPATH:$.valve_state", off="CLOSED", on="OPEN"]
        Type number : Bad_Thermostat_battery "Bad Thermostat Battery" [stateTopic = "zigbee2mqtt/Bad_Thermostat", transformationPattern = "JSONPATH:$.battery"]

and this is how my ITEMS file looks like:

Switch      Bad_Thermostat_ChildLock                                   "Bad Thermostat Child Lock"                          <lock>                (gBadTRV)                                                   ["Switch", "Opening"]             {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_child_lock"}
Number      Bad_Thermostat_CurrentHeatingSetpoint                      "Bad Thermostat Zieltemperatur"                      <temperature>         (gBadTRV)                                                   ["Setpoint", "Temperature"]       {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_current_heating_setpoint", listWidget="oh-stepper-item"[min = 16, max = 34, step = 0.5], widget="oh-stepper-card" [min = 16, max = 34, step = 0.5]}
Switch      Bad_Thermostat_EcoMode                                     "Bad Thermostat Eco Mode"                            <climate>             (gBadTRV)                                                   ["Switch", "Opening"]             {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_eco_mode"}
Number      Bad_Thermostat_EcoTemperature                              "Bad Thermostat Eco Temperatur"                      <temperature>         (gBadTRV)                                                   ["Measurement", "Temperature"]    {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_eco_temperature", listWidget="oh-stepper-item"[min = 12, max = 20, step = 1], widget="oh-stepper-card" [min = 12, max = 20, step = 1]}
Number      Bad_Thermostat_LocalTemperature                            "Bad Thermostat Aktuelle Temperatur"                 <temperature>         (gBadTRV)                                                   ["Measurement", "Temperature"]    {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_local_temperature"}
Number      Bad_Thermostat_MaxTemperature                              "Bad Thermostat Max Temperatur"                      <temperature>         (gBadTRV)                                                   ["Measurement", "Temperature"]    {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_max_temperature", listWidget="oh-stepper-item"[min = 16, max = 34, step = 1], widget="oh-stepper-card" [min = 16, max = 34, step = 1}
String      Bad_Thermostat_Preset                                      "Bad Thermostat Modus"                               <climate>             (gBadTRV)                                                   ["SetPoint", "Current"]           {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_preset"}
String      Bad_Thermostat_ProgrammingMode                             "Bad Thermostat Program"                             <climate>             (gBadTRV)                                                   ["Setpoint", "Power"]             {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_programming_mode"}
Contact     Bad_Thermostat_ValveState                                  "Bad Thermostat Ventilstatus"                        <climate>             (gBadTRV)                                                   ["Measurement", "Current"]        {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_valve_state"}
Number      Bad_Thermostat_Battery                                     "Bad Thermostat Battery  [%.0f %%]"                  <battery>             (gBadTRV, G_AlleBatterien, G_AllBatteryTest2)               ["Measurement", "Energy"]         {channel="mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_battery"}

I have two issues now which i can´t get solved.

  1. if i push in the preset channel e.g. “programming” Openhab LOG immediately shows this warning:
    Command ‘programming’ from channel ‘mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_preset’ not supported by type ‘TextValue’: Value programming not within range

What is wrong with my config?

  1. like in several Widgets and Demos ( there is a way to decrease/increase the temperature by 0.5 C steps. If i go directly to the device i am able with “+” and “-” to decrease and increase by 0.5 C. When i use above config in Openhab (UI and SiteMap) and decrease by 0.5C it quickly shows .5 but jumps after 1s back on the initial value and when i increase by 0.5 it jumps to the next higher full value. Means decrease 21C by 0.5C it quickly shows 20.5C and jumps back to 21C and increase by 0.5 quickly shows 21.5C and jumps to 22C.

Is anybode able to help me out on this?

You might find this enlightening about ‘jumping’ behavior.

Finding a better compromise for your use here really depends on understanding when your device reports newly changed values. Looking at openHABs events.log helps see the sequence.

Hi Rossko57, thanks for the feedback.
It looks the .5 steps rounding also happens when i use the GUI of Zigbee2MQTT. I am ok to go just 1°C steps - don´t worry.
Any hint to problem number 1 with the error shown openhab log?
‘mqtt:topic:HA_MQTTBroker:Bad_Thermostat:Bad_Thermostat_preset’ not supported by type ‘TextValue’: Value programming not within range

Probably to do with this

I’d be suspicious about the spaces for a start i.e. " holiday" does not equal “holiday”

sometimes the solution is that easy. thanks for the great spot.