Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zur Plugin Entwicklung

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

    Frage zur Plugin Entwicklung

    Hallo zusammen,
    ich versuche mich gerade an der Entwicklung eines Plugins. Soweit habe die Grundsätze auch verstanden. Bei den ersten Tests mit dem "Sample Plugin" stoße ich aber auf ein seltsames Verhalten für das ich mal Unterstützung brauche.

    mit der Methode
    Code:
    def parse_item(self, item):
    ...
     if self.has_iattr(item.conf, 'neato_serial'):
    würde ich gerne, wie vorgeschlagen, die item.CONF prüfen. Leider ist diese bei meinen Items immer leer. (also die conf)

    Wenn ich das item auf den Namen prüfe, klappt es. Würde mich aber gerne ans Template halten.
    Code:
     if item._name == 'Neato_Robot':
    Item.yaml und Plugin.yaml als Bild angehängt.

    Vielen Dank für eure Hilfe und Grüße,
    Thomas
    You do not have permission to view this gallery.
    This gallery has 2 photos.
    Zuletzt geändert von thengsty; 19.09.2019, 15:54.

    #2
    2 punkte:

    * du hast ein item namens neato_serial, aber keinen konfig wert zu einem item, der so heisst (bspw neato_serial: 'abcd', auf gleicher einrückungsebene wie z.b. type: str). logischerweise findet er das dann nicht



    * direkter zugriff auf "private" item attribute (_name) sollte nicht mehr gemacht werden. bitte properties verwenden (https://www.smarthomeng.de/developer...roperties.html)
    Zuletzt geändert von psilo; 19.09.2019, 17:13.

    Kommentar


      #3
      Ohje, du hast natürlich völlig recht. Da hats dran gelegen und funktioniert nun. Danke!

      Kommentar


        #4
        Ich nochmal.
        Plugins basteln macht Spaß... Das mal vorneweg. Allerdings stehe ich vor einer weiteren Herausforderung die ich nicht sauber gelöst bekomme. Mitunter stelle ich mich aber auch einfach blöd an.
        Danke vorab schon mal für eure Hilfe!
        Folgende Situation:

        - 2 Items vorhanden (itemA, itemB)
        - In "parse_item" habe ich definiert dass update_item ausgeführt werden soll wenn sich itemA ändert
        Code:
        [I]if self.has_iattr(item.conf,'IrgendeinItemA-Attribut'):
            return self.update_item[/I]
        Soweit so gut, das klappt auch wunderbar. Allerdings würde ich gerne an unten markierter Stelle in "update_item" den Wert von ItemB ändern
        Code:
        if caller != self.get_shortname():
            if self.has_iattr(item.conf,'IrgendeinItemA-Attribut'):
                self.Objekt.mache_tolle_sachen('toll')
                # hier würde ich gerne den Wert von ItemB ändern
        Wenn ich mir das ItemB vorab zwischenspeichere, kann ich den Wert dort auch ändern, was lt. Debugger funktioniert. Im SHNG Backend wird das Update aber nicht angezeit. Es ist also im Prinzip nur zur Laufzeit gültig. Mir fehlt wohl ein "Trigger" oder so, der den Item Wert ins Backend schiebt.

        Hoffentlich habe ich das einigermaßen verständlich erklärt... :-)
        Danke für eure Hilfe und Grüße,
        Thomas

        Kommentar


          #5
          log mal raus oder debugge, ob er in das update läuft
          das update muss einen neuen wert schreiben, sonst keine änderung, ausser du setzt enforce_updates im item.
          und im backend natürlich das item reloaden.. da ist kein websocket oder sowas implementiert derzeit

          Kommentar


            #6
            Verstehe ich das richtig: Wenn sich bei einem ItemA was ändert und dadurch in Deinem Plugin dessen update_item() Funktion aufgerufen wird, willst Du ein anderes Item ändern?
            Was bedeutet in dem Zusammenhang "Wenn ich mir das ItemB vorab zwischenspeichere"? Woher bekommst Du die Info was ItemB ist? Und wie willst Du das aktuell ändern?

            Kommentar


              #7
              Zitat von bmx Beitrag anzeigen
              Wenn sich bei einem ItemA was ändert und dadurch in Deinem Plugin dessen update_item() Funktion aufgerufen wird, willst Du ein anderes Item ändern?
              Genau!

              ItemB speichere ich mir in parse_item bei initialisierung weg:
              Code:
              def parse_item(self, item):
                  if self.has_iattr(item.conf, 'ItemBAttribut'):
                      self.ItemB = item
              Ich machs mal konkreter:
              Das Plugin steuert den Staubsauger:
              1) Item Reinigung(bool) -> true = Reinigung / false = Reinigung beenden
              2) Item PauseResume (bool) -> true = Pause / false = Resume

              Mein konkretes Problem:
              1. Reinigung starten (Item Reinigung = true) -> Funktion update_item startet die Funktion zur Reinigung
              2. Reinigung pause (Item PauseResume = true) -> Funktion update_item startet die Funktion für Pause. Bis hierhin alles wunderbar
              3. Wenn ich jetzt die Reinigung beende (item Reinigung = false) -> Funktion update_item startet Funktion Reinigung stoppen , würde ich gerne zusätzlich das Item PauseResume auf false setzen.
              jetzt deutlicher? ;-)
              Oder gehe ich ganz falsch an die Sache ran?
              Danke euch!

              Kommentar


                #8
                Warum 2 Items und nicht ein numerisches Item das den Status hat?

                Kommentar


                  #9
                  "Warum so einfach wenns auch kompliziert geht?"

                  Du liegst natürlich goldrichtig, so werde ich es machen und bin mir sicher dass es funktioniert. Ich werde berichten...

                  Danke für den Denkanstoß!

                  Kommentar


                    #10
                    Bin gerade wieder leicht verzweifelt, weshalb ich euch nochmals um Hilfe bitte.
                    Mein Item wird inzwischen einwandfrei mit Daten aus dem Inet aktualisiert. Ich mache dies regelmäßig in "poll_device" und setze dann dort den Wert in "_value" des jeweiligen Item Attributs. Das wird mir auch fehlerfrei im Backend angezeigt. "Update durch: assign property".

                    Das Problem ist: Werte-Änderungen werden nicht in SmartVisu angezeigt und ich benötige immer ein "F5" ! Wenn ich die Werte des Items allerdings manuell im Backend ändere, werden diese auch in SmartVisu automatisch aktualisiert.

                    Hier mal die Item Conf, ich teste mit dem Attribut "IsDocked":
                    Code:
                    Neato:
                        Robot:
                            Name:
                                type: str
                                neato_name: ''
                            State:
                                type: num
                                neato_state: 0
                            Command:
                                type: num
                                neato_command: 0
                            I[B]sDocked:
                                type: bool
                                neato_isdocked: ''
                                visu_acl: rw[/B]
                            ChargePercentage:
                                type: str
                                neato_chargepercentage: ''
                    Hat jemand eine Idee?
                    Danke!

                    Kommentar


                      #11
                      Hallo thengsty,
                      hast Du schon mal mit
                      "enforce_updates = true"
                      versucht?
                      Gruß
                      Hans

                      Kommentar


                        #12
                        Ja, das hatte ich auch schon (erfolglos) versucht. :-(
                        Danke!

                        Kommentar


                          #13
                          Was meinst Du mit _value?

                          Mit _ beginnende Werte eines Objektes sind NICHT zu Zugriff von außerhalb des Objektes gedacht. Bitte verwende die offiziellen Methoden des Item Objektes um den Wert zu setzen.
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #14
                            jo, korrekt. Das hatte ich inzwischen auch schon angepasst.
                            Code:
                             
                             item.property.value = self.robot.isDocked
                            Hat aber nicht geholfen. SmartVisu bekommt immernoch nichts von der Änderung mit.

                            Kommentar


                              #15
                              Glaube ich habe da so einen Verdacht: "last_Update" des Items wird nicht aktualisiert wenn das Update aus dem Plugin kommt. Möglicherweise wird deshalb nichts getriggert?

                              Kommentar

                              Lädt...
                              X