Seite 1 von 1

#1 Statusüberwachung von Gruppen

Verfasst: Mo 8. Feb 2016, 11:13
von harteknut
Hallo zusammen,

ich habe bei mir an der Tür ein GT4D, welches verschiedene Status anzeigt, z.B. ob auch alle Lichter aus sind.
Da ich mehr als zwölf Lichter habe und die LEDs eines Moduls daher nicht reichen, löse ich das aktuell über so eine LED-Kaskade in mehreren Modulen. Funktioniert hervorragend, ist aber absolut das Gegenteil von wartungsfreundlich oder übersichtlich.

Ich sehe mit openHAB eine Lösungsmöglichkeit, die ich folgendermaßen umsetzen wollte:
Meine Lampen habe ich alle in der (aktiven) Gruppe gLicht zusammengefasst:
Items:

Code: Alles auswählen

//Lichtgruppe
Group:Switch:OR(ON, OFF)          gLicht          "Licht [%d]"                      (All)

//Licht
Switch EG_Arbeit_Licht    "EG Arbeitszimmer"   (gLicht, gEG_Arbeit)    {lcn="[lcndemo:OUTPUT_STATUS.0.M010.2], [ON:lcndemo:ON.0.M010.2.0s],     [OFF:lcndemo:OFF.0.M010.2.0s]"}
Switch EG_KiZi_Licht    "EG Kinderzimmer"   (gLicht, gEG_KiZi)   {lcn="[lcndemo:OUTPUT_STATUS.0.M010.1], [ON:lcndemo:ON.0.M010.1.0s],     [OFF:lcndemo:OFF.0.M010.1.0s]"}
[...]
 

Sitemap:

Code: Alles auswählen

   Frame label="Uebersicht" {
      Group item=gLicht
   }

Das klapt schonmal sehr gut, ich sehe im Browser / der App genau, wie viele Lampen noch an sind und das Symbol ändert sich, sobald nix mehr an ist. (zentral-aus setze ich in einer anderen Funktion um. Hier gehts erstmal nur ums anzeigen.)
Jetzt möchte ich eine LED im Modul setzen, damit auch das GT4D was von dem Status mitbekommt, z.B. "ALLE Lampen AUS -> LED 3 in Modul 19 AUS / NICHT ALLE Lampen AUS -> LED 3 in Modul 19 AUS.

Das habe ich in mehreren Versionen über eine Rule probiert, bislang ohne Erfolg:

Code: Alles auswählen

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

rule "Lichtstatus prüfen"
   when
      Item gLicht received update
   then
         if (gLicht.members.filter(s | s.state > 0).size > 0)  {
            sendCommand (IND_Lichtstatus, OFF)
            }
         else {
            sendCommand (IND_Lichtstatus, ON)
         }
   end


Könnt Ihr mir helfen? Was mach ich denn falsch?

Das Item IND_Lichtstatus hab ich natürlich vorher in den Items angelegt:

Code: Alles auswählen

Switch IND_Lichtstatus                "LED Lichtstatus [%d]"                      {lcn="[lcndemo:LED_STATE.0.M019.3], [ON:lcndemo:LED.0.M019.3.ON],    [OFF:lcndemo:LED.0.M019.3.OFF]"}


Würde mich freuen, wenn Ihr mir helfen könnt!

Schöne Grüße,
Simon

#2 RE: Statusüberwachung von Gruppen

Verfasst: Mo 8. Feb 2016, 18:46
von Penrose
Hi,

hast du mal geprüft. ob die Regel überhaupt "greift"? Am einfachsten kannst du das mit einem Log-Eintrag am Anfang der Regel machen, z.B. mit

Code: Alles auswählen

logDebug("Rules", "Lichtstatus")


Thomas

#3 RE: Statusüberwachung von Gruppen

Verfasst: Mo 8. Feb 2016, 22:08
von harteknut
Hey Thomas,

danke für den Tip, das bau ich ein.
Die Regel greift aber, das hab ich geprüft, in dem ich in hinter dem WHEN erst mal eine Lampe togglen lasse (Natürlich nur in der "Debugging"-Phase. :-)
Die Rule läuft aber immer durch den ELSE-Teil, der Prüfausdruck ist nicht geeignet...
Ich habe auch schon

Code: Alles auswählen

if (gLicht.members.filter(s | s.state != OFF).size > 0) oder
if (gLicht.members.filter(s | s.state != "OFF").size > 0)

versucht, beides ohne Erfolg.
Am ehesten ist noch eine oder-Verküpfung in einer Variable geeignet:

Code: Alles auswählen

          then
      var lampeAn = EG_Arbeit_Licht.state == ON ||
                        EG_KiZi_Licht.state == ON
      if (lampeAn) {
         sendCommand (IND_Lichtstatus, ON)
         }
         else {
         sendCommand (IND_Lichtstatus, OFF)
         }
          end


... aber irgendwie müsste das auch mit der Auswertung der Gruppe gehen, oder nicht?
Gruß,
Simon