Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Script: Per String auf Item bzw. Group Instanzen zugreifen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    - √ - Script: Per String auf Item bzw. Group Instanzen zugreifen?

    Hallo.

    Erstmal ein dickes Lob für openHAB.
    Ich betreibe aktuell recht viele Homematic Komponenten und sondiere gerade die Möglichkeiten die mir openHAB bietet wenn ich jegliche Logik die heute innerhalb der Homematic-Welt läuft konsequent in openHAB nachbilde.

    Aktuell suche ich einen Script-Befehl der ein Äquivalent zu dem Homematic Befehl dom.GetObject("ObjectName") darstellt.

    Hintergrund:
    Meine Rollladen-Steuerung erlaubt es für jeden Raum Einstellungen vorzunehmen, ob dieser an der Automatik teilnimmt oder nicht.

    Die Items sehen dann so aus:
    Code:
    Number RollladenModus_EG_Wohnzimmer		"RollladenModus Wohnzimmer"		<rollershutter_mode> (Rollladen_Modis, EG_Wohnzimmer)
    Number RollladenModus_EG_Kueche			"RollladenModus Küche"			<rollershutter_mode> (Rollladen_Modis, EG_Kueche) 
    
    etc...
    In der Sitemap so:
    Code:
    Switch item=RollladenModus_EG_Wohnzimmer mappings=[0="AUS", 1="AN"]
    
    bzw. so:
    
    Switch item=RollladenModus_OG_Bad mappings=[0="AUS", 1="AN", 2="Nur Beschattung"]
    Nun wollte ich ein Script erstellen das aufgerufen wird wenn zum Beispiel alle Rollläden herunterfahren sollen.

    Also laufe ich per ForEach durch die Gruppe Rollladen_Modis und würde mir dann gerne aus dem Namen dieses Items das der Gruppe des Raums holen...
    Code:
    Rollladen_Modis.members.forEach(currentBlind| 
    	{
    		logInfo(currentBlind.name, "State = " + currentBlind.state)
    	    
    		if (currentBlind.state == 1){
    			// den Prefix "RollladenModus_" abschneiden...
    			var roomName = currentBlind.name.substring(currentBlind.name.indexOf("_") + 1)
    			logInfo(roomName, " Wir dürfen ...")
    			
    			//Hier fehlt mir so etwas wie: var room = GetObject(roomName)
    		}
    		
    	}
    )
    Ich habe im Quellcode gesehen das es eine ItemRegistry gibt. Kann man irgendwie aus einer Rule bzw. einem Script auf eine Instanz dieser Registry zugreifen?

    Viele Grüsse
    openHomie

    #2
    Niemand eine Idee?

    Kommentar


      #3
      Nachdem hier ja leider niemand helfen konnte, habe ich mal weiter geforscht...

      Der Trick den ich gefunden habe läuft über Gruppen.
      Man kann eine Gruppe durchsuchen und sich die Instanz des Gruppen Members liefern lassen der einen Namen entspricht den man per String angeben kann:

      Im Beispiel oben wäre das zum Beispiel:
      Code:
      var room = Raeume.members.findFirst([name==roomName])
      roomName ist in dem Fall eine String Variable ... room ist ein echtes Item.


      Ist nicht so elegant wie ein direkter Zugriff auf die ItemRegistry, aber immerhin.

      Kommentar


        #4
        Hi,

        sorry für die späte Antwort - Du hast in der Zwischenzeit aber super analysiert, eine bessere Lösung hätte ich Dir nicht vorschlagen können!
        In der Tat gibt es ein getItem(itemName) nicht - wäre vielleicht durchaus eine sinnvolle Ergänzung. Ohne so eine Methode, ist Deine schicke Gruppensuche eine gute Lösung!

        Viele Grüße,
        Kai

        Kommentar


          #5
          Dennoch danke für deine Antwort.

          Ich denke auch das ein Zugriff auf die Item Registrierung einige Dinge vereinfachen würde, gerade wenn man mehrere virtuelle Items um physikalische Funktion herum anlegt wie in meinem Beispiel die Rollladen Modi pro Raum.

          Soll ich dafür einen Issue öffnen?

          Meine andere Frage (Items verlieren ihren Zustand wenn ein Items File bearbeitet wird) hast du mir bereits im englischsprachigen Forum beantwortet

          Tschüss
          OpenHomie bzw. Lars


          Gesendet von meinem Nexus 10 mit Tapatalk 2

          Kommentar


            #6
            Zitat von openHomie Beitrag anzeigen
            Soll ich dafür einen Issue öffnen?
            Mach mal ruhig

            Kommentar


              #7
              Hallo
              Ist "getItem(itemName)" schon in openhab vorhanden.

              Habe es mit
              Code:
              var room = Raeume.members.findFirst([name==roomName])
              versucht, der Desinger bringt immer Fehler.
              "The value of the local variable room ist not used"

              Z.B.
              Items:
              Code:
              Number modbus_Solarspeicher_oben   "Temperature4 [%.d]"  <temperature> (to_modbus,modbus)   {modbus="slave6:0"}
              in Rules:
              Code:
              var  room = modbus.members.findFirst([name==modbus_Solarspeicher_oben])
              Der Name "modbus_Solarspeicher_oben" soll dann so zusammengesetzt werden:
              Code:
              "modbus_" + element1.name.toString
              Wie muss ich das anwenden?

              Gruß NetFritz
              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

              Kommentar


                #8
                Hallo
                So geht es:
                Code:
                var String My_Status
                
                My_Status = "modbus_" + element1.name.toString
                val statusToChange = to_modbus.members.findFirst(item|item.name == My_Status)
                Gruß NetFritz
                KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
                WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
                PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

                Kommentar

                Lädt...
                X