Ankündigung

Einklappen
Keine Ankündigung bisher.

Netzwerkplugin SNMP

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

    #16
    Hi,
    das steht in der Callidomus hilfe --> https://docs.callidomus.com/de/Logiken/

    Die Attribute der Items können über das Dictionary cd.itempfad.attr ausgelesen werden. z.B.cd.test.attr['MeinAttribut'] lieft den Attributwert ‘MeinAttribut’ von dem Item ‘test’.
    VG
    Jürgen

    Kommentar


      #17
      Ah ok, dann sollte der Item Typ schon mal "Dictionary" sein. Da ich ja mehrere Werte im Attribut poe_switch haben werde, wie werden dem Attribut dann Werte zugeteilt? z.B. Port5_on, Port5_off oder auch später weitere Ports?
      Die Sache hier stellt mich schon vor eigene Rästel, hab nichts Programmiersprachen oder gar Python zutun. Bitte um Nachsicht
      Vielleicht sollte ich lieber auf eine andere VISU wechseln

      Gruß
      Andreas

      Kommentar


        #18
        Würde ich anders machen der Port x Item ist Typ bool an diese Item hängst du ein Attribut mit der Zahl die die portnummer anzeigt mit dieser Nummer und den Wert des items würde ich den UDP Commando zusammenbauen.
        beschreib Mal wie sich das UDP Kommando aufbaut.
        VG Jürgen

        Kommentar


          #19
          Hallo Andreas,

          ich kann dir demnächst (Morgen oder Übermorgen) die Logik fertig machen.

          Bis bald

          Marcus

          Kommentar


            #20
            Hi Andreas,

            wenn Du mich fragst, musst Du Dir konzeptionell klar werden, was Du willst. Du solltest Deine Ports nicht "irgendwie" an und aus bekommen, sondern auf eine nachvollziehbare und sinnvolle weise, die auch zukünftig handhabbar ist. Und vor allem solltest Du die Möglichkeiten von callidomus nutzen.

            Vorschlag:
            • Jedes Item schaltet nur ein Port
            • Welchen Port es schaltet, gibst Du durch das Attribut "PortN" an, wobei N die Portnummer ist.
            • Das Item ist vom Typ bool.
            • Der Item-Wert (True oder False) gibt an, ob der Port an oder aus ist.
            Wenn Du das so machst, musst Du Dir für die Logik nur überlegen, wie ein Port ein- bzw. ausgeschaltet wird. Komplexere Aufgaben (z.B. mehrere Ports schalten) wird dann mit callidomus gelöst (in dem Beispiel dann mehrere Items schalten).

            Dein Beispielcoding enthält auch fast schon alles notwendige, Du musst nur noch den Itemwert auswerten:

            Code:
            ... der def udp-Teil bleibt unverändert ...
            
            commands_on = {
                'Port5': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 01'
            }
            commands_off = {
                'Port5': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 02'
            }
            
            item = cd.return_item(trigger.source)
            attributevalue = item.attr['poe_switch']
            
            if item:
                command = commands_on.get(attributevalue)
            else:
                command = commands_off.get(attributevalue)
            
            value = bytearray.fromhex (command)
            udp('10.10.10.3', 161, value)
            Du musst nur noch die passenden on- und off-commands für die jeweiligen Ports eintragen und entsprechend Items definieren, die als Attribut poe_switch mit dem passenden Namen definiert haben.

            Gruß, Waldemar


            P.S.: Was bringt Dich auf die Idee, dass eine andere Visu passendes Coding für DEINEN Poe-Switch haben könnte?
            OpenKNX www.openknx.de

            Kommentar


              #21
              Zitat von callidomus Beitrag anzeigen
              ich kann dir demnächst (Morgen oder Übermorgen) die Logik fertig machen.
              Hi Marcus,

              Also ich fände es besser wenn anhand von dem Beispiel ein stück doku entstehen würde mit einbischen mehr erklärung wie man eine generische Logik schreibt. Dann hätten alle was davon!

              Viele Grüsse
              Jürgen

              Kommentar


                #22
                Euch Allen erstmal ein frohes Neues und vielen Dank für die Mithilfe.

                heckmannju
                ​​​​​​​​​​​​​​Wie sieht das UDP Kommando aus? gute Frage ist jedenfalls etwas komplexer mit SNMP als eine HTTP-API. Habe den Befehl zum abschalten und einschalten der Ports mit dem MIB Browser und der passenden mib-Datei des Switchs gesendet. Per Wireshark aufgezeichnet und den benötigten "Hex Dump" in die Logik übertragen. Zum ein und ausschalten der Ports ändern sich immer nur die letzte Stelle: 01 enable bzw. 02 disable

                PS: das mit dem entstehen einer Doku sehe ich genauso. Mein Problem ist erst einmal überhaupt einen Zusammenhang / Anfang zwischen Logik, Item, Abhängikeiten usw. zufinden. Denke das würde vielen hier auch helfen Callidomus besser auszunutzen. Da bringen einer paar Codezeilen nicht viel wenn man nicht hinten den Aufbau von Callidomus kommt.

                callidomus
                ​​​​​​​Danke für dein Angebot, aber wie bereits erwähnt würde ich gerne das ganze besser Verstehen. Da hilft mir eine fertige Logik / Codeblock nur bedingt weiter. Was mich aber interessieren würde, ob es auch mit einem einzeln Item (poe_switch) und mehren Attributen funktionieren?

                mumpf
                Vielen Dank jetzt bei mir Klick gemacht , werde das gleich mal ausprobieren.

                bzgl. andere VISU: nicht direkt für "meinen" Switch aber es gibt schon Lösung zur Integration von den SNMP mib-Dateien oder mit Eingabe der passenden OID. Das wäre auch das was Marcus mit einer SNMP-Bibliothek gemeint hätte, aber hier will der aktuellen Roadmap nicht im Wege stehen.


                ​​​​​​​Grüße
                Andreas

                Kommentar


                  #23
                  irgendwo ist da noch ein Fehler:
                  2017-01-01 18:02:05 ERROR poe Logic: poe, File: /data/callidomus/local/logics/poe.py, Line: 22, Method: <module>, Exception: 'NoneType' object has no attribute 'attr'
                  Traceback (most recent call last):
                  File "/mfs/core/lib/scheduler.py", line 443, in _task
                  exec(obj.bytecode, _globals)
                  File "/data/callidomus/local/logics/poe.py", line 22, in <module>
                  attributevalue = item.attr['poe_switch']
                  AttributeError: 'NoneType' object has no attribute 'attr'
                  müsste nicht der absolute Pfad laut Doku eintragen werden? z.B. bei mir:
                  attributevalue = cd.poe_switch_port5.attr['poe_switch']
                  Das hat aber denn Nachteil, das man mit der Logik wieder nur einen Port (5) bedienen kann.

                  mit dem Eintrag wird die Logik beim erneuten laden immer mit commands_off (False) ausgeführt, egal ob das Item (cd.poe_switch_port5) den Wert 0 oder 1 hat.


                  Muss hier eigentlich noch etwas geändert werden?

                  logik.png
                  Zuletzt geändert von ragepw; 01.01.2017, 18:16.

                  Kommentar


                    #24
                    Hallo,

                    @heckmannju: was ist eine generische Logik?

                    Für das schreiben einer Logik benötigt man zwei Dinge, man muss ein bisschen Python schreiben können und die Doku lesen.

                    Ich persönlich, lerne viel aus dem Code von anderen.

                    @ragepw: Es geht auch mit einem Item und mehreren Attributen. Ich würde allerdings pro Item nur ein Attribut verwenden um den Port zuzuordnen. Das macht die Zuordnung einfacher.

                    Man könnte auch den absoluten Pfad eintragen, dann verliert man aber die Flexibilität um evtl. auch andere Ports mit der Logik zu schalten.
                    Aber wieso lautet der Pfad poe_switch_port5? Bei der Logik gibst Du doch poe_switch als Abhängigkeit an? Wie sieht denn Deine Itemstruktur aus?

                    In der Logik würde ich "if item == True:" schreiben, anstelle des "if Item"

                    Bis bald

                    Marcus

                    Kommentar


                      #25
                      mein Fehler, meinte cd.poe_switch.port5 dem natürlich folgende Item Struktur /poe_switch/port5

                      Kommentar


                        #26
                        Zitat von callidomus Beitrag anzeigen
                        @heckmannju: was ist eine generische Logik?
                        Eine Logick die nichts enthält was hart Codiert ist. Mit klar definierten ein aus ausgabe parameter. Die man beschreiben kann und jemanden anderen geben kann ohne das er gross in Sourcecode selber rumwühlen muss.

                        Kommentar


                          #27
                          hab das mal
                          if item == True:
                          eingetragen ändert aber nichts am Fehler:

                          2017-01-01 19:06:45 DEBUG Main Visu: admin (10.10.110.253:61097) sent '{"cmd":"admin","admin":"runLogic","path":"poe"} '
                          2017-01-01 19:06:45 INFO Main GUI: admin (10.10.110.253:61097) triggerd logic poe with 'None'
                          2017-01-01 19:06:45 DEBUG Main Triggering poe - caller: GUI source: admin (10.10.110.253:61097) dest: None value: None
                          2017-01-01 19:06:45 ERROR poe Logic: poe, File: /data/callidomus/local/logics/poe.py, Line: 22, Method: <module>, Exception: 'NoneType' object has no attribute 'attr'
                          Traceback (most recent call last):
                          File "/mfs/core/lib/scheduler.py", line 443, in _task
                          exec(obj.bytecode, _globals)
                          File "/data/callidomus/local/logics/poe.py", line 22, in <module>
                          attributevalue = item.attr['poe_switch']
                          AttributeError: 'NoneType' object has no attribute 'attr'
                          wenn ich den absoluten Pfad eintrage ist der Fehler weg, aber die Logik wird "False" ausgeführt.

                          hier mal die noch Itemstruktur: items.png

                          Kommentar


                            #28
                            stell am besten deinen code der logick nochmal rein.

                            Kommentar


                              #29
                              Code:
                              import socket
                              def udp(host, port, data):
                                  try:
                                      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                                      s.sendto(data, (host, port))
                                      s.close()
                                      del(s)
                                  except Exception as e:
                                      logger.warning("UDP: Problem sending data to {}:{}:{} ".format(host, port, data))
                                      pass
                                  else:
                                      logger.debug("UDP: Sending data to {}:{}:{} ".format(host, port, data))
                              
                              commands_on = {
                                  'Port5': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 01',
                              }
                              commands_off = {
                                  'Port5': '30 34 02 01 00 04 07 70 72 69 76 61 74 65 a3 26 02 04 23 3c e9 d9 02 01 00 02 01 00 30 18 30 16 06 11 2b 06 01 04 01 81 2b 0a 4c 12 01 16 01 01 03 01 05 02 01 02',
                              }
                              
                              item = cd.return_item(trigger.source)
                              attributevalue = item.attr['poe_switch']
                              
                              if item == True:
                                  command = commands_on.get(attributevalue)
                              else:
                                  command = commands_off.get(attributevalue)
                              
                              value = bytearray.fromhex (command)
                              
                              udp('10.10.10.3', 161, value)
                              und hier noch das entsprechende Item:
                              item1.png
                              item2.png

                              Kommentar


                                #30
                                Item ist kein bool. Ich denke da muss muss noch () dahinter.

                                If Item() == True :

                                Aber der Fehler fliegt ja schon drüber..Du mußt den Trigger auf poe_switch.port5 angeben.

                                VG juergen
                                Zuletzt geändert von heckmannju; 01.01.2017, 21:31.

                                Kommentar

                                Lädt...
                                X