Dynamisches Item / Gruppenliste

GUI Relevanten, PaperUI, BasicUI, HabPanel ...

Moderatoren: seppy, udo1toni

Antworten
DarkWolf
Beiträge: 9
Registriert: 24. Okt 2019 12:53

Dynamisches Item / Gruppenliste

Beitrag von DarkWolf »

Hallo zusammen,

ich erstelle in einer Rule ein Item und füge es einer Gruppe hinzu. Im Widget wird dieses aber leider nicht angezeigt. Hat jemand einen Tipp was ich übersehe oder geht das generell nicht?

Das Item wird laut Logging angelegt und ohne Fehlermeldung der Gruppe hinzugefügt.

Befehl in Rule:

Code: Alles auswählen

var StringItem temporaryItem = (new StringItem(NeueMeldungID))
temporaryItem.setState(new StringType(NeueMeldungText))
temporaryItem.label = "Hallo"
AlarmListe.member.add(temporaryItem)
Widget:

Code: Alles auswählen

<table class="table">
   <tr ng-repeat="item in itemsInGroup('AlarmListe')">    
        <td>{{item.label}}</td>    
  </tr>
</table>
Grundlegendes Ziel ist es eine Art dynamische Meldungsliste zu erstellen. Dieser kann ich dann mit Rules Meldungen hinzufügen bzw. wieder entfernen. Da ich diese unter anderem mit einem MagicMirror anzeigen lassen will, ist eine HABPanel Ansicht als IFrame mein Lösungsansatz.

Benutzeravatar
udo1toni
Beiträge: 13931
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Dynamisches Item / Gruppenliste

Beitrag von udo1toni »

Ich fürchte, das ist so nicht vorgesehen.

Du musst auch bedenken, dass dieses Item, da es innerhalb der Rule erzeugt wurde, auch nur innerhalb der Rule Gültigkeit hat. Es mag sein, dass es sich über die Grenzen der Rule hinaus auswirkt (obwohl es das eigentlich nicht sollte...), aber spätestens, wenn die Rule beendet wurde, muss das Item auch wieder entfernt werden. Eine "gute" Rule sollte nur wenige Millisekunden benötigen, um ihre Arbeit zu tun...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

DarkWolf
Beiträge: 9
Registriert: 24. Okt 2019 12:53

Re: Dynamisches Item / Gruppenliste

Beitrag von DarkWolf »

Ich denke ich habe eine brauchbare Alternative.

Der Ansatz ist, dass ich einige Items vorab erstelle und diese entsprechend als Speicher missbrauche. Mit Persistence würden die Meldungen auch bei einem Neustart erhalten bleiben.

items

Code: Alles auswählen

Group     Messages        "Liste aller Meldungen"
String     MessageSet      "Dummy zum setzen/löschen von Alarmmeldungen"
String Message_1  "" (Messages)
String Message_2  "" (Messages)
String Message_3  "" (Messages)
String Message_4  "" (Messages)
String Message_5  "" (Messages)
String Message_6  "" (Messages)
String Message_7  "" (Messages)
String Message_8  "" (Messages)
String Message_9  "" (Messages)
String Message_10 "" (Messages)
rule

Code: Alles auswählen

rule "Alarm Service"
    when                
        Item MessageSet received command
    then        
        logInfo("Alarm Service", "Trigger ausgelöst")
        var NeueMeldungID  = MessageSet.state.toString.split(":").get(0)
        var NeueMeldungText = MessageSet.state.toString.split(":").get(1)
        
        if ( NeueMeldungID == "Remove") {
            
            if ( NeueMeldungText == "All") {
                // Alle Meldungen löschen
                Messages.members.forEach [item | 
                    sendCommand(item, "")        
                ]
            } else {
                // Bestimmte Meldung löschen
                Messages.members.forEach [item |                 
                      if ( item.state.toString().startsWith(NeueMeldungText + ":") )
                      {
                          sendCommand(item, "")
                      }
                ]

            }
        } else {     
            // Prüfen ob selbe Meldung schon existiert
            val TmpExist = false
            Messages.members.forEach [item | 
                if ( item.state.toString() == MessageSet.state.toString() )
                {
                    TmpExist = true
                }
            ]

            // Wenn Meldung noch nicht existiert
            val TmpBreak = false 
            if ( TmpExist == false)
            {
                Messages.members.forEach [item | 
                    if (item.state == NULL || item.state.toString() == "")
                    {
                        if ( TmpBreak == false)
                        {
                            sendCommand(item, MessageSet.state.toString())
                        }
                        TmpBreak = true
                    }            
                    ]
            }
        }
    end
widget

Code: Alles auswählen

<div ng-repeat="item in itemsInGroup('Messages')">
  <div ng-if="item.state != ''">{{item.state.split(':')[1]}}</div>
</div>
Den State von "MessageSet" kann ich jetzt wie folgende setzen:

Mit "FensterXYZ:Das Fenster XYZ ist noch offen" füge ich der "Liste" eine Meldung hinzu
Mit "Remove:FensterXYZ" entferne ich es
Mit "Remove:All" lösche ich die komplette Liste

PS: Die Rule wäre schlanker wenn ich auf die Schnelle rausgefunden hätte wie man eine forEach abbricht.

Antworten