[OH3] Main UI - main_widget - Part 6 - The Security Card [3.3.0;3.4.9)

This widget card will show the members of your configured security groups and the state of your alarm system. For usage, you will need the following groups and items in your modell and configured within the main_widget.

  • securityGroup [semantic or non semantic]
    The security group holds all items of type contact, motion or camera. The state of ech item will be shown as a badge.
  • securityMode
    The securityMode item is of type string item which can have the following states (strings): disarmed, armed-away and armed-home. The state will colorize the icons like shown below [inactive - gray, active green or red]

Screenshots

image

Changelog

Version 0.2

  • styling changes
  • implemeted accordion lists with badges
  • added pin secured buttons for changing security mode. To use this, you need to install the main_widget_Security_Keypad widget as well.

Version 0.1

  • initial release

Resources

uid: main_widget_Security_Card
tags: []
props:
  parameters:
    - context: item
      description: Security Group Item
      label: Security Group
      name: securityGroup
      required: true
      type: TEXT
    - context: item
      description: Security Mode Item
      label: Security Mode
      name: securityMode
      required: true
      type: TEXT
    - context: item
      description: Security PIN Item
      label: Security PIN
      name: referencePIN
      required: false
      type: TEXT
component: f7-card
config:
  style:
    background: =(themeOptions.dark=="light") ? ("white"):("black")
    --f7-card-header-border-color: transparent
    border-radius: 10px
    margin-left: 5px
    margin-right: 5px
slots:
  default:
    - component: f7-card-content
      config:
        style:
          height: auto
      slots:
        default:
          - component: f7-row
            config:
              style:
                justify-content: space-between
            slots:
              default:
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            securityMode: =props.securityMode
                            referencePIN: =props.referencePIN
                            targetMode: armed-home
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "armed-home"  ? "gray" : "red"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: ARMED HOME
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            securityMode: =props.securityMode
                            referencePIN: =props.referencePIN
                            targetMode: disarmed
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "disarmed"  ? "gray" : "green"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: DISARMED
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            securityMode: =props.securityMode
                            referencePIN: =props.referencePIN
                            targetMode: armed-away
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "armed-away"  ? "gray" : "red"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: ARMED AWAY
          - component: f7-list
            config:
              noHairlinesBetween: true
              accordionList: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      margin-top: 15px
                      fontSize: 15px
                      font-weight: bold
                    title: Door Sensors
                  slots:
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconMaterial: sensor_door
                          iconColor: '=loop.doorMember.state != "CLOSED" ? "red" : "gray"'
                          iconSize: 20px
                    default:
                      - component: f7-accordion-content
                        config:
                          noHairlinesBetween: true
                          accordionList: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                fragment: true
                                for: securityGroupMember
                                sourceType: itemsWithTags
                                itemTags: Door
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            fetchMetadata: semantics
                                            fragment: true
                                            for: doorMember
                                            sourceType: itemsInGroup
                                            groupItem: =loop.securityGroupMember.name
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    margin-top: -7px
                                                    fontSize: 14px
                                                    font-weight: 800
                                                  title: =loop.doorMember.label
                                                slots:
                                                  default:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconMaterial: sensor_door
                                                        iconColor: '=loop.doorMember.state != "CLOSED" ? "red" : "gray"'
                                                        iconSize: 20px
          - component: f7-list
            config:
              noHairlinesBetween: true
              accordionList: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      margin-top: 15px
                      fontSize: 15px
                      font-weight: bold
                    title: Window Sensors
                  slots:
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconMaterial: sensor_window
                          iconColor: '=loop.cameraMember.state != "CLOSED" ? "red" : "gray"'
                          iconSize: 20px
                    default:
                      - component: f7-accordion-content
                        config:
                          noHairlinesBetween: true
                          accordionList: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                fragment: true
                                for: securityGroupMember
                                sourceType: itemsWithTags
                                itemTags: Window
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            fetchMetadata: semantics
                                            fragment: true
                                            for: windowMember
                                            sourceType: itemsInGroup
                                            groupItem: =loop.securityGroupMember.name
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    margin-top: -7px
                                                    fontSize: 14px
                                                    font-weight: 800
                                                  title: =loop.windowMember.label
                                                slots:
                                                  default:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconMaterial: sensor_window
                                                        iconColor: '=loop.windowMember.state != "CLOSED" ? "red" : "gray"'
                                                        iconSize: 20px
          - component: f7-list
            config:
              noHairlinesBetween: true
              accordionList: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      margin-top: 15px
                      fontSize: 15px
                      font-weight: bold
                    title: Motion Sensors
                  slots:
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconMaterial: sensors
                          iconColor: '=loop.motionMember.state != "OFF" ? "red" : "gray"'
                          iconSize: 20px
                    default:
                      - component: f7-accordion-content
                        config:
                          noHairlinesBetween: true
                          accordionList: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                fragment: true
                                for: securityGroupMember
                                sourceType: itemsWithTags
                                itemTags: MotionDetector
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            fetchMetadata: semantics
                                            fragment: true
                                            for: motionMember
                                            sourceType: itemsInGroup
                                            groupItem: =loop.securityGroupMember.name
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    margin-top: -7px
                                                    fontSize: 14px
                                                    font-weight: 800
                                                  title: =loop.motionMember.label
                                                slots:
                                                  default:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconMaterial: sensors
                                                        iconColor: '=loop.motionMember.state != "OFF" ? "red" : "gray"'
                                                        iconSize: 20px
          - component: f7-list
            config:
              noHairlinesBetween: true
              accordionList: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      margin-top: 15px
                      fontSize: 15px
                      font-weight: bold
                    title: Surveillance
                  slots:
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconMaterial: video_camera_front
                          iconColor: '=loop.cameraMember.state != "CLOSED" ? "red" : "gray"'
                          iconSize: 20px
                    default:
                      - component: f7-accordion-content
                        config:
                          noHairlinesBetween: true
                          accordionList: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                fragment: true
                                for: securityGroupMember
                                sourceType: itemsWithTags
                                itemTags: Camera
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            fetchMetadata: semantics
                                            fragment: true
                                            for: cameraMember
                                            sourceType: itemsInGroup
                                            groupItem: =loop.securityGroupMember.name
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    margin-top: -7px
                                                    fontSize: 14px
                                                    font-weight: 800
                                                  title: =loop.cameraMember.label
                                                slots:
                                                  default:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconMaterial: video_camera_front
                                                        iconColor: '=loop.cameraMember.state != "OFF" ? "red" : "gray"'
                                                        iconSize: 20px
3 Likes

Hello. Is this project still active it doesn’t work anymore in openhab 4. Thank you

Yes and No :wink:
There will be a new openHAB 4.x version published soon, with many optimizations and using features not available in openHAB 3.x

BTW, what is not working ?

Well the state icon of each item in the accordeon list and also the keypad complains in the logs of error 405 I can get more info later if you need detailed logs.

Yes please…

l2023-08-03 19:15:42.127 [ERROR] [rg.apache.cxf.jaxrs.utils.JAXRSUtils] - No message body reader has been found for class java.lang.String, ContentType: application/octx
x2023-08-03 19:15:42.128 [WARN ] [s.impl.WebApplicationExceptionMapper] - javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type                          x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1473)                                                                              x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.processRequestBodyParameter(JAXRSUtils.java:950)                                                                       x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:881)                                                                                 x
x       at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:215)                                                              x
x       at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:79)                                                                x
x       at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)                                                                       x
x       at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)                                                                 x
x       at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)                                                               x
x       at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)                                                             x
x       at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)                                                                        x
x       at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)                                                                        x
x       at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)                                                                    x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:298)                                                             x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)                                                                    x
x       at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)                                                                                                 x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:273)                                                                   x
x       at org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet.service(OsgiInitializedServlet.java:102)                                                        x
x       at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)                                                                                       x
x       at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)                                                                         x
x       at org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain.doFilter(OsgiFilterChain.java:100)                                                                     x
x       at org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler.doHandle(PaxWebServletHandler.java:310)                                                        x
x       at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)                                                                                x
x       at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)                                                                                  x
x       at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)                                                                              x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)                                                                            x
x       at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)                                                                           x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)                                                                            x
x       at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)                                                                           x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)                                                                             x
x       at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)                                                                                    x
x       at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)                                                                            x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)                                                                             x
x       at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)                                                                            x
x       at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)                                                                                x
x       at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)                                                          x
x       at org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection.handle(PrioritizedHandlerCollection.java:96)                                           x
x       at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:722)                                                                               x
x       at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)                                                                              x
x       at org.eclipse.jetty.server.Server.handle(Server.java:516)                                                                                                      x
x       at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)                                                                                   x
x       at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)                                                                                          x
x       at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)                                                                                            x
x       at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)                                                                                  x
x       at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)                                                                  x
x       at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)                                                                                            x
x       at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)                                                                                         x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)                                                                       x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)                                                                     x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)                                                                    x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)                                                                           x
x       at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)                                                     x
x       at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)                                                                             x
x       at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)                                                                        x
x       at java.base/java.lang.Thread.run(Thread.java:833)                                                                                                              x
m

And this one when I enter pin code

x2023-08-03 16:35:50.649 [WARN ] [s.impl.WebApplicationExceptionMapper] - javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type                          x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1473)                                                                              x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.processRequestBodyParameter(JAXRSUtils.java:950)                                                                       x
x       at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:881)                                                                                 x
x       at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:215)                                                              x
x       at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:79)                                                                x
x       at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)                                                                       x
x       at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)                                                                 x
x       at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)                                                               x
x       at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)                                                             x
x       at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)                                                                        x
x       at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)                                                                        x
x       at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)                                                                    x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:298)                                                             x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)                                                                    x
x       at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)                                                                                                 x
x       at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:273)                                                                   x
x       at org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet.service(OsgiInitializedServlet.java:102)                                                        x
x       at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)                                                                                       x
x       at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1656)                                                                         x
x       at org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain.doFilter(OsgiFilterChain.java:100)                                                                     x
x       at org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler.doHandle(PaxWebServletHandler.java:310)                                                        x
x       at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)                                                                                x
x       at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)                                                                                  x
x       at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)                                                                              x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)                                                                            x
x       at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)                                                                           x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)                                                                            x
x       at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)                                                                           x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)                                                                             x
x       at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)                                                                                    x
x       at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)                                                                            x
x       at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)                                                                             x
x       at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)                                                                            x
x       at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)                                                                                x
x       at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)                                                          x
x       at org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection.handle(PrioritizedHandlerCollection.java:96)                                           x
x       at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:722)                                                                               x
x       at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)                                                                              x
x       at org.eclipse.jetty.server.Server.handle(Server.java:516)                                                                                                      x
x       at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)                                                                                   x
x       at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)                                                                                          x
x       at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)                                                                                            x
x       at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)                                                                                  x
x       at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)                                                                  x
x       at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)                                                                                            x
x       at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)                                                                                         x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)                                                                       x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)                                                                     x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)                                                                    x
x       at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)                                                                           x
x       at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)                                                     x
x       at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)                                                                             x
x       at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)                                                                        x
x       at java.base/java.lang.Thread.run(Thread.java:833)                                                                                                              x
x

Doing this from phone but it’s a start and my items are contact. Need more info

I see some issues not caused by our widgets, but how you are using them.

The Security Widget is designed to use with the „Main_Widget“, not standalone and not within the overview page of MainUI.
The errors in the log are not produced by our widgets.

Then I am by myself on this one. Any plans to release them as standalone ?
I apreciate it
Thank you

No, nothing planned yet, but we will see….

Here is a quick fix which should work standalone within openHAB 4

uid: main_widget_Security_Card
tags: []
props:
  parameters:
    - context: item
      description: Security Group Item
      label: Security Group
      name: securityGroup
      required: true
      type: TEXT
    - context: item
      description: Security Mode Item
      label: Security Mode
      name: securityMode
      required: true
      type: TEXT
    - context: item
      description: Security PIN Item
      label: Security PIN
      name: referencePIN
      required: false
      type: TEXT
timestamp: Nov 28, 2022, 8:18:26 AM
component: f7-card
config:
  style:
    --f7-card-header-border-color: transparent
    background: =(themeOptions.dark=="light") ? ("white"):("black")
    border-radius: 10px
    margin-left: 5px
    margin-right: 5px
slots:
  default:
    - component: f7-card-content
      config:
        style:
          height: auto
      slots:
        default:
          - component: f7-row
            config:
              style:
                justify-content: space-between
            slots:
              default:
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            referencePIN: =props.referencePIN
                            securityMode: =props.securityMode
                            targetMode: armed-home
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "armed-home"  ? "gray" : "red"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: ARMED HOME
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            referencePIN: =props.referencePIN
                            securityMode: =props.securityMode
                            targetMode: disarmed
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "disarmed"  ? "gray" : "green"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: DISARMED
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:main_widget_Security_Keypad
                          actionModalConfig:
                            referencePIN: =props.referencePIN
                            securityMode: =props.securityMode
                            targetMode: armed-away
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: '=vars.objVar.selectThing=="Security" ? true : false'
                          icon-f7: checkmark_shield_fill
                          iconColor: '=items[props.securityMode].state != "armed-away"  ? "gray" : "red"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark=="light" ? white : black'
                            font-size: 14px
                            height: auto
                          text: ARMED AWAY
          - component: f7-list
            config:
              accordionList: true
              noHairlinesBetween: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      font-weight: bold
                      fontSize: 15px
                      margin-top: 15px
                    title: Door Sensors
                  slots:
                    default:
                      - component: f7-accordion-content
                        config:
                          accordionList: true
                          noHairlinesBetween: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                filter: '((loop.doorMember.category == "Door") || ((loop.doorMember.category).includes("door"))) ? true : false'
                                for: doorMember
                                fragment: true
                                itemTags: OpenState
                                sourceType: itemsWithTags
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: f7-list-item
                                          config:
                                            style:
                                              font-weight: 800
                                              fontSize: 14px
                                              margin-top: -7px
                                            title: "=loop.doorMember.metadata.uiSemantics ? loop.doorMember.metadata.uiSemantics.config.equipment + loop.doorMember.metadata.uiSemantics.config.preposition + loop.doorMember.metadata.uiSemantics.config.location : loop.doorMember.label"
                                          slots:
                                            inner-end:
                                              - component: f7-chip
                                                config:
                                                  bgColor: transparent
                                                  iconColor: '=(items[loop.doorMember.name].state == "CLOSED") ? "gray" : "red"'
                                                  iconMaterial: sensor_door
                                                  iconSize: 20px
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconColor: '=Number(items.gDoorsOpen.state)>=1 ? "red" : "gray"'
                          iconMaterial: sensor_door
                          iconSize: 20px
          - component: f7-list
            config:
              accordionList: true
              noHairlinesBetween: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      font-weight: bold
                      fontSize: 15px
                      margin-top: 15px
                    title: Window Sensors
                  slots:
                    default:
                      - component: f7-accordion-content
                        config:
                          accordionList: true
                          noHairlinesBetween: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                filter: '((loop.windowMember.category == "Window") || (loop.windowMember.category == "window")) ? true : false'
                                for: windowMember
                                fragment: true
                                itemTags: OpenState
                                sourceType: itemsWithTags
                              slots:
                                default:
                                  - component: oh-list
                                    config:
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: f7-list-item
                                          config:
                                            style:
                                              font-weight: 800
                                              fontSize: 14px
                                              margin-top: -7px
                                            title: "=loop.windowMember.metadata.uiSemantics ? loop.windowMember.metadata.uiSemantics.config.equipment + loop.windowMember.metadata.uiSemantics.config.preposition + loop.windowMember.metadata.uiSemantics.config.location : loop.windowMember.label"
                                          slots:
                                            inner-end:
                                              - component: f7-chip
                                                config:
                                                  bgColor: transparent
                                                  iconColor: '=items[loop.windowMember.name].state == "CLOSED" ? "gray" : "red"'
                                                  iconMaterial: sensor_window
                                                  iconSize: 20px
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconColor: '=Number(items.gWindowsOpen.state)>=1 ? "red" : "gray"'
                          iconMaterial: sensor_window
                          iconSize: 20px
          - component: f7-list
            config:
              accordionList: true
              noHairlinesBetween: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      font-weight: bold
                      fontSize: 15px
                      margin-top: 15px
                    title: Motion Sensors
                  slots:
                    default:
                      - component: f7-accordion-content
                        config:
                          accordionList: true
                          noHairlinesBetween: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                filter: '((loop.motionDetector.category=="Motion") || (loop.motionDetector.category=="motion")) ? true : false'
                                for: motionDetector
                                fragment: true
                                itemTags: Alarm,Presence
                                sourceType: itemsWithTags
                              slots:
                                default:
                                  - component: f7-list-item
                                    config:
                                      style:
                                        font-weight: 800
                                        fontSize: 14px
                                        margin-top: -7px
                                      title: "=loop.motionDetector.metadata.uiSemantics ? loop.motionDetector.metadata.uiSemantics.config.equipment + loop.motionDetector.metadata.uiSemantics.config.preposition + loop.motionDetector.metadata.uiSemantics.config.location : loop.motionDetector.label"
                                    slots:
                                      inner-end:
                                        - component: f7-chip
                                          config:
                                            bgColor: transparent
                                            iconColor: '=items[loop.motionDetector.name].state == "OFF" ? "gray" : "red"'
                                            iconMaterial: sensors
                                            iconSize: 20px
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconColor: '=Number(items.motionDetected.state)>=1 ? "red" : "gray"'
                          iconMaterial: sensors
                          iconSize: 20px
          - component: f7-list
            config:
              accordionList: true
              noHairlinesBetween: true
            slots:
              default:
                - component: f7-list-item
                  config:
                    accordionItem: true
                    style:
                      font-weight: bold
                      fontSize: 15px
                      margin-top: 15px
                    title: Surveillance
                  slots:
                    default:
                      - component: f7-accordion-content
                        config:
                          accordionList: true
                          noHairlinesBetween: true
                        slots:
                          default:
                            - component: oh-repeater
                              config:
                                accordionList: true
                                fetchMetadata: semantics,widgetOrder,uiSemantics
                                filter: '((loop.motionDetector.category=="Camera") || (loop.surveillance.category=="camera")) ? true : false'
                                for: surveillance
                                fragment: true
                                itemTags: Control,Power
                                sourceType: itemsWithTags
                              slots:
                                default:
                                  - component: f7-list-item
                                    config:
                                      style:
                                        font-weight: 800
                                        fontSize: 14px
                                        margin-top: -7px
                                      title: "=loop.surveillance.metadata.uiSemantics ? loop.surveillance.metadata.uiSemantics.config.equipment + loop.surveillance.metadata.uiSemantics.config.preposition + loop.surveillance.metadata.uiSemantics.config.location : loop.surveillance.label"
                                    slots:
                                      inner-end:
                                        - component: f7-chip
                                          config:
                                            bgColor: transparent
                                            iconColor: '=items[loop.surveillance].state == "OFF" ? "red" : "gray"'
                                            iconMaterial: video_camera_front
                                            iconSize: 20px
                    inner-end:
                      - component: f7-chip
                        config:
                          bgColor: transparent
                          iconColor: gray
                          iconMaterial: video_camera_front
                          iconSize: 20px
1 Like

bothering you again i am getting alot of these warning when i look at the state of the sensors etc and also they dont update correctly:

┌2023-08-05 09:50:00.906 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: gDoorsOpen                                                          │
│2023-08-05 09:50:00.906 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: gWindowsOpen                                                        │
│2023-08-05 09:50:00.907 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: motionDetected                                                      │
│2023-08-05 09:50:00.907 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: [object Object]                                                     │
│2023-08-05 09:50:01.004 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: gDoorsOpen                                                          │
│2023-08-05 09:50:01.005 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: gWindowsOpen                                                        │
└2023-08-05 09:50:01.005 [WARN ] [e.internal.SseItemStatesEventBuilder] - Attempting to send a state update of an item which doesn't exist: motionDetected

Did you create the groups and Items as described. Logs show errors according to wrong definitions….

hmm man i need to read the documentation … really sorry i was under the impression all is dinamic done based in semantics. Thanks :persevere:

i know i am going to spam this tread let me know if i do but i have another question this doesnt work anymore the icon never changes and i have more than 1 sensor with red icons

iconColor: '=Number(items.g_general_windows.state)>=1 ? "red" : "gray"'

You changed the code didn‘t you ?
Need to habe a closet look when back home.

Do yourself a favor and stop messing around with this version….
Spoiler on:

Not everything can be achieved trough the semantic model. We need some non semantic groups for counting number of open windows e.g.

wow nice how do you achive the logic for the alarm do you have a dedicated alarm or rules ?

The number of alarms in the screenshot is not part of the security widget itself, this is shown from the bottom navbar of the top level widget.
It is a simple little badge showing the state of the „gBatteriesEmpty“ non semantic group item.

Got it in a working state for my own setup now using the keypad widget found on the forum

uid: alarm_control_widget
tags: []
props:
  parameters:
    - description: A custom widget for controlling the alarm system
      label: Alarm Control Widget
      name: alarmControlWidget
      required: false
      type: TEXT
timestamp: Aug 5, 2023, 1:04:45 PM
component: f7-card
config:
  style:
    --f7-card-header-border-color: transparent
    background: '=(themeOptions.dark==="light") ? "white" : "black"'
    border-radius: 10px
    margin-left: 5px
    margin-right: 5px
  title: Alarm Control
slots:
  default:
    - component: f7-card-content
      config:
        style:
          height: auto
      slots:
        default:
          - component: f7-row
            config:
              style:
                justify-content: space-between
            slots:
              default:
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: command
                          actionCommand: ARMED_HOME
                          actionItem: Alarm_Command
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          icon-f7: checkmark_shield_fill
                          iconColor: '=(items.Alarm_State.state) == "ARMED_HOME"  ? "red" : "grey"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark==="light" ? "white" : "black"'
                            font-size: 14px
                            height: auto
                          text: ARMED HOME
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: popup
                          actionModal: widget:keypad
                          actionModalConfig:
                            closePopup: true
                            item: Alarm_Code
                            mask: "*"
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          icon-f7: checkmark_shield_fill
                          iconColor: '=(items.Alarm_State.state) == "DISARMED"  ? "green" : "grey"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark==="light" ? "white" : "black"'
                            font-size: 14px
                            height: auto
                          text: DISARM
                - component: f7-col
                  config:
                    style:
                      text-align: center
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: command
                          actionCommand: ARMED_AWAY
                          actionItem: Alarm_Command
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          icon-f7: checkmark_shield_fill
                          iconColor: '=(items.Alarm_State.state) == "ARMED_AWAY" ? "red" : "grey"'
                          iconSize: 60
                          style:
                            --f7-button-bg-color: transparent
                            --f7-button-hover-bg-color: '=vars.objVar.selectThing=="Security" ? "F8BB00" : "transparent"'
                            --f7-button-padding-horizontal: 0px
                            --f7-button-padding-vertical: 0px
                            --f7-button-text-color: 'themeOptions.dark==="light" ? "white" : "black"'
                            font-size: 14px
                            height: auto
                          text: ARMED AWAY
    - component: f7-list
      config:
        accordionList: true
        noHairlinesBetween: true
      slots:
        default:
          - component: f7-list-item
            config:
              accordionItem: true
              style:
                font-weight: bold
                fontSize: 15px
                margin-top: 15px
              title: Adjust Entry/Exit Times
            slots:
              default:
                - component: f7-accordion-content
                  slots:
                    default:
                      - component: oh-slider-card
                        config:
                          item: EntryTime_Home
                          max: 60
                          min: 0
                          scale: true
                          scaleSteps: 10
                          scaleSubSteps: 5
                          step: 1
                          title: Home Entry Time
                      - component: oh-slider-card
                        config:
                          item: ExitTime_Home
                          max: 60
                          min: 0
                          scale: true
                          scaleSteps: 10
                          scaleSubSteps: 5
                          step: 1
                          title: Home Exit Time
          - component: f7-list-item
            config:
              accordionItem: true
              style:
                font-weight: bold
                fontSize: 15px
                margin-top: 15px
              title: Sensors & Surveillance
            slots:
              default:
                - component: f7-accordion-content
                  slots:
                    default:
                      - component: f7-list
                        config:
                          accordionList: true
                          noHairlinesBetween: true
                        slots:
                          default:
                            - component: f7-list-item
                              config:
                                accordionItem: true
                                style:
                                  font-weight: bold
                                  fontSize: 15px
                                  margin-top: 15px
                                title: Door Sensors
                              slots:
                                default:
                                  - component: f7-accordion-content
                                    config:
                                      accordionList: true
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            accordionList: true
                                            fetchMetadata: semantics,widgetOrder,uiSemantics
                                            filter: '((loop.doorMember.category == "Door") || ((loop.doorMember.category).includes("door"))) ? true : false'
                                            for: doorMember
                                            fragment: true
                                            itemTags: OpenState
                                            sourceType: itemsWithTags
                                          slots:
                                            default:
                                              - component: oh-list
                                                config:
                                                  noHairlinesBetween: true
                                                slots:
                                                  default:
                                                    - component: f7-list-item
                                                      config:
                                                        style:
                                                          font-weight: 800
                                                          fontSize: 14px
                                                          margin-top: -7px
                                                        title: "=loop.doorMember.metadata.uiSemantics ? loop.doorMember.metadata.uiSemantics.config.equipment + loop.doorMember.metadata.uiSemantics.config.preposition + loop.doorMember.metadata.uiSemantics.config.location : loop.doorMember.label"
                                                      slots:
                                                        inner-end:
                                                          - component: f7-chip
                                                            config:
                                                              bgColor: transparent
                                                              iconColor: '=(items[loop.doorMember.name].state == "CLOSED") ? "gray" : "red"'
                                                              iconMaterial: sensor_door
                                                              iconSize: 20px
                                inner-end:
                                  - component: f7-chip
                                    config:
                                      bgColor: transparent
                                      iconColor: '=(items.g_general_door.state) == "OPEN" ? "red" : "gray"'
                                      iconMaterial: sensor_door
                                      iconSize: 20px
                            - component: f7-list-item
                              config:
                                accordionItem: true
                                style:
                                  font-weight: bold
                                  fontSize: 15px
                                  margin-top: 15px
                                title: Window Sensors
                              slots:
                                default:
                                  - component: f7-accordion-content
                                    config:
                                      accordionList: true
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            accordionList: true
                                            fetchMetadata: semantics,widgetOrder,uiSemantics
                                            filter: '((loop.windowMember.category == "Window") || (loop.windowMember.category == "window")) ? true : false'
                                            for: windowMember
                                            fragment: true
                                            itemTags: OpenState
                                            sourceType: itemsWithTags
                                          slots:
                                            default:
                                              - component: oh-list
                                                config:
                                                  noHairlinesBetween: true
                                                slots:
                                                  default:
                                                    - component: f7-list-item
                                                      config:
                                                        style:
                                                          font-weight: 800
                                                          fontSize: 14px
                                                          margin-top: -7px
                                                        title: "=loop.windowMember.metadata.uiSemantics ? loop.windowMember.metadata.uiSemantics.config.equipment + loop.windowMember.metadata.uiSemantics.config.preposition + loop.windowMember.metadata.uiSemantics.config.location : loop.windowMember.label"
                                                      slots:
                                                        inner-end:
                                                          - component: f7-chip
                                                            config:
                                                              bgColor: transparent
                                                              iconColor: '=items[loop.windowMember.name].state == "CLOSED" ? "gray" : "red"'
                                                              iconMaterial: sensor_window
                                                              iconSize: 20px
                                inner-end:
                                  - component: f7-chip
                                    config:
                                      bgColor: transparent
                                      iconColor: '=(items.g_general_windows.state) == "OPEN" ? "red" : "gray"'
                                      iconMaterial: sensor_window
                                      iconSize: 20px
                            - component: f7-list-item
                              config:
                                accordionItem: true
                                style:
                                  font-weight: bold
                                  fontSize: 15px
                                  margin-top: 15px
                                title: Motion Sensors
                              slots:
                                default:
                                  - component: f7-accordion-content
                                    config:
                                      accordionList: true
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            accordionList: true
                                            fetchMetadata: semantics,widgetOrder,uiSemantics
                                            filter: '((loop.motionDetector.hasTag("Sensor") && loop.motionDetector.hasTag("Presence")) && loop.motionDetector.hasCategory("MotionDetector")) ? true : false'
                                            for: motionDetector
                                            fragment: true
                                            itemTags: Sensor,Presence
                                            sourceType: itemsWithTags
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    font-weight: 800
                                                    fontSize: 14px
                                                    margin-top: -7px
                                                  title: "=loop.motionDetector.metadata.uiSemantics ? loop.motionDetector.metadata.uiSemantics.config.equipment + loop.motionDetector.metadata.uiSemantics.config.preposition + loop.motionDetector.metadata.uiSemantics.config.location : loop.motionDetector.label"
                                                slots:
                                                  inner-end:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconColor: '=items[loop.motionDetector.name].state == "CLOSED" ? "gray" : "red"'
                                                        iconMaterial: sensors
                                                        iconSize: 20px
                                inner-end:
                                  - component: f7-chip
                                    config:
                                      bgColor: transparent
                                      iconColor: '=(items.g_general_movement.state) == "OPEN" ? "red" : "gray"'
                                      iconMaterial: sensors
                                      iconSize: 20px
                            - component: f7-list-item
                              config:
                                accordionItem: true
                                style:
                                  font-weight: bold
                                  fontSize: 15px
                                  margin-top: 15px
                                title: Surveillance
                              slots:
                                default:
                                  - component: f7-accordion-content
                                    config:
                                      accordionList: true
                                      noHairlinesBetween: true
                                    slots:
                                      default:
                                        - component: oh-repeater
                                          config:
                                            accordionList: true
                                            fetchMetadata: semantics,widgetOrder,uiSemantics
                                            filter: '((loop.surveillance.hasTag("Status") && loop.surveillance.hasTag("Camera"))) ? true : false'
                                            for: surveillance
                                            fragment: true
                                            itemTags: Status,Camera
                                            sourceType: itemsWithTags
                                          slots:
                                            default:
                                              - component: f7-list-item
                                                config:
                                                  style:
                                                    font-weight: 800
                                                    fontSize: 14px
                                                    margin-top: -7px
                                                  title: "=loop.surveillance.metadata.uiSemantics ? loop.surveillance.metadata.uiSemantics.config.equipment + loop.surveillance.metadata.uiSemantics.config.preposition + loop.surveillance.metadata.uiSemantics.config.location : loop.surveillance.label"
                                                slots:
                                                  inner-end:
                                                    - component: f7-chip
                                                      config:
                                                        bgColor: transparent
                                                        iconColor: '=items[loop.surveillance].state == "OFF" ? "red" : "gray"'
                                                        iconMaterial: video_camera_front
                                                        iconSize: 20px
                                inner-end:
                                  - component: f7-chip
                                    config:
                                      bgColor: transparent
                                      iconColor: '=(items.g_general_camera.state) == "OPEN" ? "red" : "gray"'
                                      iconMaterial: video_camera_front
                                      iconSize: 20px

Now I need to figure out the rules to have a full blown alarm in openhab should I open a new tread for this ?
Thank you :+1:

As the rules for your personal alarm system are not part of our project, yes.

But keep in mind, first try jourself and ask in a new topic if you get stuck.

To give you an idea what you could do:

Motion: create a rule triggered by motion detection to send s notification/ do a specific action, but only if security_mode does not equal „disarmed“
This could be extended by a group „gMotionDetected“ and state of the group changes to „>0“
….