Seite 1 von 1
Dynamisches Item / Gruppenliste
Verfasst: 15. Dez 2019 07:54
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.
Re: Dynamisches Item / Gruppenliste
Verfasst: 15. Dez 2019 10:45
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...
Re: Dynamisches Item / Gruppenliste
Verfasst: 15. Dez 2019 14:10
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.