Ankündigung

Einklappen
Keine Ankündigung bisher.

Suchen und Zählen von Objekten in Status

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

    Suchen und Zählen von Objekten in Status

    Gerade habe ich wohl die Menge an Items groß genug bekommen, dass es unübersichtlich wird.

    Gern würde ich jetzt in der Übersicht Zusammenfassungen haben. Diese, so stell ich mir vor, kann ich in den Quad-Buttons ja mit klein anzeigen.

    Lichter AN: 303 / Lichter AUS: 3940
    Rollos UNTEN: 70%
    Haus-Temperatur: 907 C

    Okay, soweit ich verstanden hab, müsste dafür eine Logik her!?

    mit sh.match_items kann ich schonmal bestimmte items suchen. Aber bekomm ich nen count des Ergebniss? An den Zustand der items komme ich so auch noch nicht.

    Dumm-Code:
    [alle_lichter_status]
    eval = sh.match_items('*.lights' == on) # Suche alle "lights" die "on" sind
    counter = sh.match_items.count

    Nun müsste ich das Update bei jedem Licht triggern. Oder kann ich zentral einen Listener an alle Lichter hängen, der bei Änderung triggert? Würde watch_item = *.lights das für mich tun?

    Ich experimentiere mal mit den Basics der Logiken. Falls wer aber schon auf den Trichter kam, wären Tipps willkommen…


    Danke!

    #2
    Ich hab jetzt erstmal mit dem logger angefangen zu spielen:
    Code:
    for item in sh.match_items('*.Deckenleuchte'):     # selects all items ending with 'Deckenleuchte'
        logger.info(item.id())
    
    logger.info(len(sh.match_items('*.Deckenleuchte')))
    Aus der Hilfe heraus gebastelt, bekomme ich schonmal alle Leuchten zusammen. Mit len hab ich auch korrekt die Größe des Arrays rausbekommen. Das müsste sich auch ummünzen lassen in ein Attribut soweit ich find_items verwende. Dann liessen sich alle Lampen mit count = yes/no in die Zählung einbeziehen.

    Jetzt komm ich aber nicht an den Status, also AN oder AUS. Ich will ja nur die Lampen haben, die an sind.

    Der Nachts dimmen-Artikel ist schonmal ganz hilfreich. Aber auch dort wird auf Attribute geprüft, nicht den aktuellen Status.

    In der Basic structure-Hilfe wird ja auf off/on geprüft. Also muss darin irgendwo die Wahrheit liegen...

    Kommentar


      #3
      Probiere mal das:

      Code:
      for item in sh.match_items('*.Deckenleuchte'):     # selects all items ending with 'Deckenleuchte'
          if item():                                     # selects if item ist True
              logger.info("Deckenlampe ist an:{}".format(item.id()))
      Könnte klappen, hab ich aber auch nicht getestet .
      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        #4
        Hi JuMi,

        inzwischen bin ich so weit gekommen:
        Code:
        #!/usr/bin/env python
        
        counter = []
        
        for item in sh.match_items('*.Deckenleuchte'):
            if item():
                counter.append(item)
        
        logger.info("Es sind " + str(len(counter)) + " Lichter an!")
        das tut auch anscheinend ganz gut tun. Jetzt muss ich nur überlegen wo ich trigger und wohin ich das ganze dann schreibe um es visualisieren zu können.

        Kommentar


          #5
          Noch ein wenig weiter…

          items.conf:
          Code:
          [counter]
          	[[Deckenleuchte]]
          		type = num
          logic.conf
          Code:
          [counter]
              filename = counter.py
          	watch_item = *.Deckenleuchte
          	set_item = counter.Deckenleuchte
          	set_value = 0
          counterspy
          Code:
          #!/usr/bin/env python
          
          counter = []
          
          for item in sh.match_items('*.Deckenleuchte'):
              if item():
                  counter.append(item)
          
          length = str(len(counter))
          
          logger.info("Lights on: " + length)
          sh.counter.Deckenleuchte(length)
          Der Logger tut soweit fast gut. Die Rückgabe an sh.counter.Deckenleuchte tut aber nicht. Ich dachte ich schreibe an das Gruppenobjekt, damit ich das dann in der Visu zeigen kann. Komischerweise bleibts hier aber bei Null.

          Kommentar


            #6
            Ich glaube das müsste:

            Code:
            sh.counter.Deckenleuchte()=length
            Aber sicher bin ich mir da nicht ... nen Versuch ist es wert.
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Zitat von JuMi2006 Beitrag anzeigen
              Ich glaube das müsste:

              Code:
              sh.counter.Deckenleuchte()=length
              Aber sicher bin ich mir da nicht ... nen Versuch ist es wert.
              Nein, das funktioniert nicht.

              set_item = counter.Deckenleuchte
              set_value = 0
              gibt es nicht. Und wird auch nicht verwendet.

              Und wieso ein Liste generieren, wenn es nur um die Anzahl geht?

              Code:
              counter = 0
              if item():
                  counter += 1
              Bis bald

              Marcus

              Kommentar


                #8
                Hallo Marcus,

                danke für Deine Antwort!

                Ich arbeite gern mit array.length, da dieses counter plus und minus in der Vergangenheit (klassische PHP-Counter für Websites ) irgendwie immer daneben ging. Vielleicht kann ich damit auch noch mehr anfangen. Z.B.: nochmal nach Eigenschaften innerhalb der Liste umsortieren/filtern.

                Da es aber eigentlich nur lokal einmal durchgezählt wird, hast Du recht…

                das set_item und set_value hatte ich aus dem Nachtdimmen-Thread. Denn wie bekomme ich den Inhalt von counter aus der Visu aufgerufen?

                sh.counter.Deckenleuchte()=length schmeißt mir eine Exception:
                Code:
                2013-12-10 19:01:59 ERROR    Main         Exception: can't assign to function call (counter.py, line 10)
                Traceback (most recent call last):
                  File "/usr/smarthome/lib/logic.py", line 119, in generate_bytecode
                    self.bytecode = compile(code, self.filename, 'exec')
                  File "/usr/smarthome/logics/counter.py", line 10
                    sh.counter.Deckenleuchte()=counter
                   ^
                SyntaxError: can't assign to function call
                logic.counter => sh.counter.Deckenleuchte, nur wie?

                Kommentar

                Lädt...
                X