Seite 1 von 1

Kann man einen String in einem „Custom“ Item speichern?

Verfasst: 12. Jan 2023 11:55
von Scooter_0807
Hallo zusammen,

ich habe mehrere Heizkörper-Thermostate im Einsatz, die ich über OH Rules steuere.
In den Rules habe ich die Heizkörper-Parameter in einem JSON-Array definiert, damit in den Rules diese Arrays in einer Schleife durchlaufen kann.
z.B. sieh das Array so aus.

Code: Alles auswählen

var HKArray= [
  {
    "Name":"Heizkörper Wintergarten",                            // Heizkörper Name
    "SollTempItem":"HeizkorperWintergarten_Solltemperatur",      // HK-Item, in dem am HK die Solltemperatur gespeichert
    "KomfTempItem":"FehmarnKomforttemperaturWintergartenEG",     // Item, in dem die Komfortemperatur vorgegeben ist
    "NachtTempItem":"FehmarnNachttemperatur",                    // Item, in dem die Nachttemperatur vorgegeben ist
    "AbwesenheitsTemperaturItem":"FehmarnAbwesenheittemperatur", // Item, in dem die Abwesenheitstemperatur gespeichert ist
    "ReagiereAufNachtModus":"TRUE",                              // definiert ob die HK nachts abgesenkt wird (TRUE/FALSE)
    "ReagiereAufAbwesenheit":"TRUE",                             // definiert ob die HK bei Abwesenheit abgesenkt wird (TRUE/FALSE)
    "NachtabsenkungItem":"FehmarnNachtabsenkung",                // Item in dem gespeichert wird ob die Nachtabsenkung aktiv (ON/OFF)
    "AbwesenheitItem":"FehmarnAbwesendErdgeschoss"               // Item in dem gespeichert ist ob die Abwesenheit aktiv (ON/OFF)
  },
{
    "Name":"Heizkörper Jüche",                            // Heizkörper Name
    "SollTempItem":"HeizkorperKuech_Solltemperatur",      // HK-Item, in dem am HK die Solltemperatur gespeichert
    "KomfTempItem":"FehmarnKomforttemperaturKuecheEG",     // Item, in dem die Komfortemperatur vorgegeben ist
    "NachtTempItem":"FehmarnNachttemperatur",                    // Item, in dem die Nachttemperatur vorgegeben ist
    "AbwesenheitsTemperaturItem":"FehmarnAbwesenheittemperatur", // Item, in dem die Abwesenheitstemperatur gespeichert ist
    "ReagiereAufNachtModus":"TRUE",                              // definiert ob die HK nachts abgesenkt wird (TRUE/FALSE)
    "ReagiereAufAbwesenheit":"TRUE",                             // definiert ob die HK bei Abwesenheit abgesenkt wird (TRUE/FALSE)
    "NachtabsenkungItem":"FehmarnNachtabsenkung",                // Item in dem gespeichert wird ob die Nachtabsenkung aktiv (ON/OFF)
    "AbwesenheitItem":"FehmarnAbwesendErdgeschoss"               // Item in dem gespeichert ist ob die Abwesenheit aktiv (ON/OFF)
  }
];
Der Vorteil: Wenn ein neues Thermostat dazukommt muss ich in den Rules nur einen JSON-Eintrag hinzufügen.
Nachteil: Ich muss in jeder Rule dieses JSON-Array eintragen.

Jetzt meine Frage:
Gibt es eine Möglichkeit, dass ich solch ein JSON-Array in einem Item speichern kann und wie kann ich solch ein Item dann in den Rules wieder abrufen.


Vielen Dank für Eure Hilfe!

Re: Kann man einen String in einem „Custom“ Item speichern?

Verfasst: 12. Jan 2023 17:29
von udo1toni
Das ist der falsche Ansatz. Nutze die Funktionen, die openHAB zur Verfügung stellt. Hier heißt das Zauberwort GroupItems.
Es gibt verschiedene Ansätze dazu, Du kannst z.B. für alle Items eines bestimmten Typs ein Group Item anlegen, z.B. gHKSoll wären alle Solltemperaturen aller Thermostaten.
Essenziell ist, dass es in jedem Itemnamen ein Merkmal gibt, welches eindeutig für das Thermostat ist. Dieser Teilstring sollte mit Unterstrichen abgegrenzt sein. Auf diese Weise kannst Du diesen Namensteil jeweils ermitteln und andere Gruppen nach diesem Namensteil filtern. Natürlich muss der Namensteil eindeutig sein. Du erhältst also pro Thermostat eine Liste Items, diese Liste unterscheidet sich von Thermostat zu Thermostat nur durch den Namensteil des Thermostaten, alle Items eines Thermostaten weisen den selben Namensteil auf. Beispiel:

Code: Alles auswählen

HK_Wintergarten_Soll (gHKSoll)
HK_Wintergarten_SetKomfort (gHKKomfort)
HK_Wintergarten_SetNacht (gHKNacht)
HK_Wintergarten_SetStandby (gHKStandby)
HK_Wintergarten_EnableNacht (gHKEnableNacht)
HK_Wintergarten_EnableStandby (gHKEnableStandby)
HK_Wintergarten_NachtAktiv (gHKNachtAktik)
HK_Wintergarten_StandbyAktiv (gHKStandbyAktiv)
Alle anderen Items legst Du nach dem selben Schema an, vor allem liegen sie alle in den gleichen Gruppen.
Nun kannst Du innerhalb einer Rule z.B. alle Solltemperaturen durchlaufen:

Code: Alles auswählen

gHKSoll.members.forEach[soll|
    val hk = soll.name.split("_").get(1) // der Teil zwischen erstem und zweiten _
    val setKomfort = gHKKomfort.members.filter[i|i.name.split("_").get(1) == hk].head
    val setNacht   =   gHKNacht.members.filter[i|i.name.split("_").get(1) == hk].head
    ...
]
hk ist nun der Name des gerade aktuellen Heizkörpers, z.B. "Wintergarten" als String.
setKomfort ist das Item (!) ...SetKomfort des passenden Heizkörpers, z.B. HK_Wintergarten_SetKomfort.
Du kannst innerhalb des Lambdas also z.B. setKomfort.state as Number verwenden, um die Komforttemperatur abzurufen, oder
soll.sendCommand(setKomfort.state.toString), um den Wert aus setKomfort als Solltemperatur zu setzen.
Du musst so lediglich die Items den richtigen Gruppen zuweisen (und natürlich darauf achten, dass die Namen passend gewählt sind).

Ein weiterer Ansatz wäre, alle Items, welche nur abhängig verwendet werden in eine gemeinsame Gruppe zu packen und dann den Typ anhand des letzten Teilstrings zuzuordnen. Es kommt halt drauf an, was Du wie steuerst, ob dieser Weg sinnvoll ist.
Jedenfalls brauchst Du nur exakt eine Rule, welche die Items nur indirekt anspricht (also indem sie das passende Item vorher anhand der Merkmale aus den Gruppen heraussucht) sowie die Gruppen für die Items.

Es bietet sich an, den aktiven Status als Zahl zu speichern, also z.B. 1 für Komfort, 2 für Nacht, 3 für Standby, 4 für Frostschutz. Dann brauchst Du Pro Thermostat nur ein Item für die aktuelle Betriebsart. Die Zahl lässt sich leicht als entsprechender Text anzeigen (MAP Transformation im Display) und Du kannst Dir eine Menge Befehle ersparen (also z.B. Betriebsart.sendCommand 1 statt nachtAktiv.sendCommand(OFF) standbyAktiv.sendCommand(OFF)

Re: Kann man einen String in einem „Custom“ Item speichern?

Verfasst: 21. Jan 2023 17:37
von Scooter_0807
Hallo udo1toni,

vielen Dank für Deine ausführliche Antwort.
Nachdem ich erstmal die Doku und Videos zum Semantik-Modell gelesen/gesehen habe kann ich den Inhalt verstehen.

ich baue jetzt mein Konfiguration Stück für Stück um.

D.h. ich baue das Modell jetzt so auf

Gruppe Heizkörper ==> darin sind alle Heizkörper enthalten. Ein Heizkörper ist ebenfalls eine Gruppe
Dann definiere ich Items, die für alle Heizkörper gleich sind. Zum Beispiel Nachttemperatur oder Abwesenheitstemperatur. Diese Items weise ich als GroupMember den Heizkörper zu.
Dann definiere ich Items, die für jeden Heizkörper spezifisch sind, z.B. die Komfortemperatur eines Raumes oder die aktuelle Solltemperatur. Jedes dieser Items wird immer nur einem Heizkörper zugewiesen.

Deinem Vorschlag folgend nutze ich eine Namenskonvention für die Items
z.B.
HK_KomfTemp_Wohnzimmer, HK_KomfTemp_Arbeitszimmer für die Komfortemperaturen jedes Zimmers
HK_NachtTemp_Alle für die Nachttemperatur.

In den Rules kann ich jetzt, ausgehend von der Gruppe der Heizkörper, alle Groupmembers in einer Schleife durchgehen und für jeden Groupmember alle Parameter ermitteln.

Dank Deines Inputs kann ich neue Heizköper-Items rein über das Semantik-Modell hinzufügen und muss nicht mehr in den Code der Rules eingreifen. Höchstens bei den Triggern für die Rules muss ich diese hinzufügen.

Also, vielen Dank!