Action context parameter groups are not properly displayed on configuration dialogs

As suggested by @JustinG in openHAB 5.2 Milestone discussion I start a new topic here.

Meanwhile I did a fresh install of Openhab 5.2 M6.

I just added my widget:

version: 1
widgets:
  solar_plant_state:
    tags:
      - solar
      - cell
    props:
      parameters:
        - description: Name of the solar plant
          label: Name
          name: prop_name
          required: false
          type: TEXT
        - context: item
          description: Item holding the current grid power (+ = green; - = red)
          label: Grid Power
          name: item_grid
          required: false
          type: TEXT
        - context: item
          description: Item holding the current house power Consumption
          label: House Power
          name: item_house
          required: false
          type: TEXT
        - context: item
          description: Item holding the current solar power
          label: Solar Power
          name: item_solar
          required: false
          type: TEXT
        - context: item
          description: Item holding the current battery power (+ = green; - = red)
          label: Battery Power
          name: item_bat
          required: false
          type: TEXT
        - context: item
          description: Item holding the battery level
          label: Battery Level
          name: item_soc
          required: false
          type: TEXT
        - description: Treshold for Pause
          label: Treshold
          name: prop_tres
          required: true
          type: INTEGER
      parameterGroups:
        - name: action1
          context: action
          label: Action, when items clicked
    component: f7-card
    config:
      title: =props.prop_name
    slots:
      default:
        - component: f7-row
          slots:
            default:
              - component: f7-col
                slots:
                  default:
                    - component: oh-button
                      config:
                        actionPropsParameterGroup: action1
                        class:
                          - display-flex
                          - justify-content-center
                        color: "=(themeOptions.dark === 'light') ? 'black' : 'white'"
                        style:
                          font-size: 16px
                          font-weight: bold
                        text: =items[props.item_grid].displayState  || items[props.item_grid].state
                    - component: f7-row
                      slots:
                        default:
                          - component: f7-col
                            config:
                              class:
                                - display-flex
                                - justify-content-center
                            slots:
                              default:
                                - component: f7-icon
                                  config:
                                    f7: power
                                    size: 40
                          - component: f7-col
                            config:
                              class:
                                - display-flex
                                - justify-content-center
                            slots:
                              default:
                                - component: f7-icon
                                  config:
                                    color: "=(Number.parseInt(items[props.item_grid].state) > props.prop_tres) ? 'dark_red' : (Number.parseInt(items[props.item_grid].state) < -1 * props.prop_tres) ? 'green' : (themeOptions.dark === 'light') ? 'black' : 'white'"
                                    f7: "=(Number.parseInt(items[props.item_grid].state) > props.prop_tres) ? 'arrow_right_circle' : (Number.parseInt(items[props.item_grid].state) < -1 * props.prop_tres) ? 'arrow_left_circle' : 'pause_circle'"
                                    size: 40
              - component: f7-col
                config:
                  class:
                    - display-flex
                    - flex-direction-column
                slots:
                  default:
                    - component: oh-button
                      config:
                        actionPropsParameterGroup: action1
                        class:
                          - display-flex
                          - justify-content-center
                        color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                        style:
                          font-size: 16px
                          font-weight: bold
                        text: =items[props.item_house].displayState || items[props.item_house].state
                    - component: f7-icon
                      config:
                        class:
                          - align-self-center
                        f7: house_alt
                        size: 60
                    - component: f7-icon
                      config:
                        class:
                          - align-self-center
                        color: "=(Number.parseInt(items[props.item_bat].state) > props.prop_tres) ? 'dark_red' : (Number.parseInt(items[props.item_bat].state) < -1 * props.prop_tres) ? 'green' : (themeOptions.dark === 'light') ? 'black' : 'white'"
                        f7: "=(Number.parseInt(items[props.item_bat].state) > props.prop_tres) ? 'arrow_up_circle' : (Number.parseInt(items[props.item_bat].state) < -1 * props.prop_tres) ? 'arrow_down_circle' : 'pause_circle'"
                        size: 40
                    - component: oh-icon
                      config:
                        class:
                          - display-flex
                          - justify-content-center
                        icon: battery
                        state: =items[props.item_soc].state
                        style:
                          height: 60px
                    - component: oh-button
                      config:
                        actionPropsParameterGroup: action1
                        class:
                          - display-flex
                          - justify-content-center
                        color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                        style:
                          font-size: 16px
                          font-weight: bold
                        text: =items[props.item_bat].displayState || items[props.item_bat].state
              - component: f7-col
                slots:
                  default:
                    - component: oh-button
                      config:
                        actionPropsParameterGroup: action1
                        class:
                          - display-flex
                          - justify-content-center
                        color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                        style:
                          font-size: 16px
                          font-weight: bold
                        text: =items[props.item_solar].displayState || items[props.item_solar].state
                    - component: f7-row
                      slots:
                        default:
                          - component: f7-col
                            config:
                              class:
                                - display-flex
                                - justify-content-center
                            slots:
                              default:
                                - component: f7-icon
                                  config:
                                    color: "=(Number.parseInt(items[props.item_solar].state) > props.prop_tres) ? 'green' : (themeOptions.dark === 'light') ? 'black' : 'white'"
                                    f7: "=(Number.parseInt(items[props.item_solar].state) > props.prop_tres) ? 'arrow_left_circle' : 'pause_circle'"
                                    size: 40
                          - component: f7-col
                            config:
                              class:
                                - display-flex
                                - justify-content-center
                            slots:
                              default:
                                - component: f7-icon
                                  config:
                                    f7: sun_max
                                    size: 40

and a simple page:

version: 1
pages:
  overview:
    tags: []
    props:
      parameters: []
      parameterGroups: []
    component: oh-layout-page
    config:
      label: Overview
    slots:
      canvas: []
      default:
        - component: oh-block
          config: {}
          slots:
            default:
              - component: oh-grid-row
                config: {}
                slots:
                  default:
                    - component: oh-grid-col
                      config: {}
                      slots:
                        default:
                          - component: oh-label-card
                            config:
                              action: analyzer
                              actionAnalyzerItems:
                                - Lokale_Sonnendaten_Position_Elevation
                                - Lokale_Sonnendaten_Azimut
                              item: Lokale_Sonnendaten_Sonnenphase
                    - component: oh-grid-col
                      config: {}
                      slots:
                        default:
                          - component: oh-label-card
                            config:
                              item: Lokale_Monddaten_Mondphase
                    - component: oh-grid-col
                      config: {}
                      slots:
                        default:
                          - component: widget:solar_plant_state
                            config: {}
                    - component: oh-grid-col
                      config: {}
                      slots:
                        default: []
      grid: []
      masonry: []

Result: The action parameters are not displayed in the configuration dialogs:

Any ideas, how to get the action properties displayed?

I downgraded the install to 5.1.4.

Result: The action properties are displayed.

The beginning of the widget yaml, looks different after downgrade:

uid: solar_plant_state
tags:
  - cell
  - solar
props:
  parameters:
    - description: Name of the solar plant
      label: Name
      name: prop_name
      required: false
      type: TEXT
    - context: item
      description: Item holding the current grid power (+ = green; - = red)
      label: Grid Power
      name: item_grid
      required: false
      type: TEXT
    - context: item
      description: Item holding the current house power Consumption
      label: House Power
      name: item_house
      required: false
      type: TEXT
    - context: item
      description: Item holding the current solar power
      label: Solar Power
      name: item_solar
      required: false
      type: TEXT
    - context: item
      description: Item holding the current battery power (+ = green; - = red)
      label: Battery Power
      name: item_bat
      required: false
      type: TEXT
    - context: item
      description: Item holding the battery level
      label: Battery Level
      name: item_soc
      required: false
      type: TEXT
    - description: Treshold for Pause
      label: Treshold
      name: prop_tres
      required: true
      type: INTEGER
  parameterGroups:
    - name: action1
      context: action
      label: Action, when items clicked
timestamp: Jun 22, 2026, 8:48:38 PM
component: f7-card
config:
  title: =props.prop_name
slots:
  default:
    - component: f7-row
      slots:
        default:
          - component: f7-col
            slots:
              default:
                - component: oh-button
                  config:
                    actionPropsParameterGroup: action1
                    class:
                      - display-flex
                      - justify-content-center
                    color: "=(themeOptions.dark === 'light') ? 'black' : 'white'"
                    style:
                      font-size: 16px
                      font-weight: bold
                    text: =items[props.item_grid].displayState  || items[props.item_grid].state
                - component: f7-row
                  slots:
                    default:
                      - component: f7-col
                        config:
                          class:
                            - display-flex
                            - justify-content-center
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                f7: power
                                size: 40
                      - component: f7-col
                        config:
                          class:
                            - display-flex
                            - justify-content-center
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                color: "=(Number.parseInt(items[props.item_grid].state) > props.prop_tres) ?
                                  'dark_red' :
                                  (Number.parseInt(items[props.item_grid].state)
                                  < -1 * props.prop_tres) ? 'green' :
                                  (themeOptions.dark === 'light') ? 'black' :
                                  'white'"
                                f7: "=(Number.parseInt(items[props.item_grid].state) > props.prop_tres) ?
                                  'arrow_right_circle' :
                                  (Number.parseInt(items[props.item_grid].state)
                                  < -1 * props.prop_tres) ? 'arrow_left_circle'
                                  : 'pause_circle'"
                                size: 40
          - component: f7-col
            config:
              class:
                - display-flex
                - flex-direction-column
            slots:
              default:
                - component: oh-button
                  config:
                    actionPropsParameterGroup: action1
                    class:
                      - display-flex
                      - justify-content-center
                    color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                    style:
                      font-size: 16px
                      font-weight: bold
                    text: =items[props.item_house].displayState || items[props.item_house].state
                - component: f7-icon
                  config:
                    class:
                      - align-self-center
                    f7: house_alt
                    size: 60
                - component: f7-icon
                  config:
                    class:
                      - align-self-center
                    color: "=(Number.parseInt(items[props.item_bat].state) > props.prop_tres) ?
                      'dark_red' : (Number.parseInt(items[props.item_bat].state)
                      < -1 * props.prop_tres) ? 'green' : (themeOptions.dark ===
                      'light') ? 'black' : 'white'"
                    f7: "=(Number.parseInt(items[props.item_bat].state) > props.prop_tres) ?
                      'arrow_up_circle' :
                      (Number.parseInt(items[props.item_bat].state) < -1 *
                      props.prop_tres) ? 'arrow_down_circle' : 'pause_circle'"
                    size: 40
                - component: oh-icon
                  config:
                    class:
                      - display-flex
                      - justify-content-center
                    icon: battery
                    state: =items[props.item_soc].state
                    style:
                      height: 60px
                - component: oh-button
                  config:
                    actionPropsParameterGroup: action1
                    class:
                      - display-flex
                      - justify-content-center
                    color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                    style:
                      font-size: 16px
                      font-weight: bold
                    text: =items[props.item_bat].displayState || items[props.item_bat].state
          - component: f7-col
            slots:
              default:
                - component: oh-button
                  config:
                    actionPropsParameterGroup: action1
                    class:
                      - display-flex
                      - justify-content-center
                    color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                    style:
                      font-size: 16px
                      font-weight: bold
                    text: =items[props.item_solar].displayState || items[props.item_solar].state
                - component: f7-row
                  slots:
                    default:
                      - component: f7-col
                        config:
                          class:
                            - display-flex
                            - justify-content-center
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                color: "=(Number.parseInt(items[props.item_solar].state) > props.prop_tres) ?
                                  'green' : (themeOptions.dark === 'light') ?
                                  'black' : 'white'"
                                f7: "=(Number.parseInt(items[props.item_solar].state) > props.prop_tres) ?
                                  'arrow_left_circle' : 'pause_circle'"
                                size: 40
                      - component: f7-col
                        config:
                          class:
                            - display-flex
                            - justify-content-center
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                f7: sun_max
                                size: 40

I’ve found a problem with the widget, but it seems to be unrelated to the missing actions: The INTEGER property prop_tres is required but doesn’t have a default value. This makes it produce an error when the properties’ dialog is opened. You should add a default value to the parameter.

That’s correct. 5.2 now includes and (nearly) universal yaml format and the new header information is part of that.

I saw that too. It’s only throwing a warning and not actually halting the properties dialog, but I agree that it’s usually a good idea to have a default value for a required parameter.

The actual problem is new, however (as demonstrated by the correct display in 5.1.4). It’s that you have the character array action in the name of the action group. If you name your action group anything without that exact character sequence (e.g., ckickAct or even actiion ← not recommended!) then the group is displayed properly again.

This doesn’t feel to me like a huge issue, but I can see a lot of users including action in the name of their “action” groups, so it should probably be addressed. @Nadahar what do you think?

I’m still scratching my head trying to figure out exactly what happens. Good find with the name of the group. I have no idea yet exactly what causes this to not work if the group name starts action. Do you have any clues that can help me find the source of the problem (any reported errors/warnings or other indications of what’s going on)?

I haven’t found anything concrete yet, but I’m looking with some suspicion at

edit: No, that one can’t have caused it as far as I can tell. Do we know if this worked or not with M5?

I don’t consider this solved yet, renaming the group is more of a workaround. There can be lots of widgets out there with such naming, so we should figure out the exact reason.

It’s not working with M5, M4, M3, M2.

It’s working with M1.

Therefore, by my simple testing, the topic was introduced with M2.

No, there are no browser error or warnings. It fails completely silently.

action of course is regex’d out of any prefix naming and always has been as far as I can recall. But as long as there are any additional characters the resulting action config prefix should still be valid. My gut feeling is this goes back to the actions refactor to typescript, but I have nothing to justify that feeling at all.

If the group name has action in it, then the vue rendering fails here:

but, that’s been the same forever. So, something has changed that means when group name is modified because it has action in it, that modification is not the same between p.groupName and group.name. I don’t have access to vue dev tools at the moment so I can’t tell what the discrepancy is.

I found it, and you were right, the bug was introduced in Refactor widget definitions to TypeScript by florian-h05 · Pull Request #3959 · openhab/openhab-webui · GitHub

During refactoring, this:

export const actionParams = (groupName, paramPrefix) => {

..was refactored to this:

export const actionParams = (paramPrefix?: string, groupName?: string) => {

..but references to the method wasn’t updated, which means that groupName and paramPrefix is effectively swapped. I’m not sure exactly why the result is that action can’t be a part of the name, this “logic” is quite intricate, but swapping the order back makes it work.

It works with RC1. Thanks for your efforts!