UDP-Status in Loxone verwerten

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Sebastian
    LoxBus Spammer
    • 28.08.2015
    • 244

    #1

    UDP-Status in Loxone verwerten

    Moin zusammen,

    folgendes Problem:

    Ich bekomme über ein Skript auf dem Loxberry per UDP von einem Bewegungsmelder einen Wert "1" bei Bewegung übermittelt.

    Wenn ich diesen per virtuellen Eingang anzeigen lassen, ist er ja immer 1 nach der ersten Übermittlung (es gibt leider keinen Status 0).

    Wie kriege ich es (per Loxone) hin, dass der Wert nach einer Zeit wieder auf 0 gesetzt wird, um dann wieder auf eine Bewegung zu reagieren?

    Gruß Sebastian
  • AlexAn
    Lebende Foren Legende
    • 25.08.2015
    • 4456

    #2
    Kommt am UDP Monitor überhaupt 0 an?
    Grüße Alex

    Kommentar

    • Sebastian
      LoxBus Spammer
      • 28.08.2015
      • 244

      #3
      Hallo Alex,

      nein, nur 1. Das ist es ja...

      Etwas dirty ist ja die Validierung zu verwenden, um nach einer Zeit auf 0 zu setzen.
      Aber dann kommt natürlich auch eine Meldung.
      Also ich bräuchte sowas wie den Timeout bei der Validierung oder so...

      Kommentar

      • AlexAn
        Lebende Foren Legende
        • 25.08.2015
        • 4456

        #4
        Was für ein Melder ist das und welches Script bzw. wer verschickt die Nachricht?
        Grüße Alex

        Kommentar

        • Sebastian
          LoxBus Spammer
          • 28.08.2015
          • 244

          #5
          Ein Mijia Human Body Sensor

          Skript:
          Code:
          import socket
          
          from mihome.connector import XiaomiConnector
          
          #Loxone address and port
          UDP_IP = 'XXX.XXX.XXX.XXX' #IP Miniserver
          UDP_PORT = XXXX #Port
          
          # Open socket connection
          sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
          
          # List of supported models
          class MODEL:
          CUBE = 'cube'
          GATEWAY = 'gateway'
          MAGNET = 'magnet'
          MOTION = 'motion'
          SENSOR_HT = 'sensor_ht'
          SMOKE = 'smoke'
          SWITCH = 'switch' #'86sw1'
          WATER_LEAK = 'sensor_wleak.aq1'
          
          # Supported values
          class VALUE:
          ALARM = 'alarm'
          DENSITY = 'density'
          HUMIDITY = 'humidity'
          ILLUMINATION = 'illumination'
          STATUS = 'status'
          TEMPERATURE = 'temperature'
          CHANNEL_0 = 'channel_0'
          ROTATE = 'rotate'
          VOLTAGE = 'voltage'
          
          # Matrix that links values for models, conversion added
          MODEL_VALUES_MATRIX = {
          MODEL.CUBE: {VALUE.STATUS: (dict, {'flip90': 'flip90',
          'flip180': 'flip180',
          'free_fall': 'free_fall',
          'move': 'move',
          'rotate': 'rotate',
          'shake_air': 'shake_air',
          'tap_twice': 'tap_twice'},
          ),
          VALUE.VOLTAGE: (int, 1000),
          # VALUE.ROTATE: (int, replace(',','')),
          },
          MODEL.GATEWAY: {VALUE.ILLUMINATION: (int, 1),
          },
          MODEL.MAGNET: {VALUE.STATUS: (dict, {'close': '0',
          'open': '1'}),
          VALUE.VOLTAGE: (int, 1000),
          },
          MODEL.MOTION: {VALUE.STATUS: (dict, {'motion': '1'}),
          VALUE.VOLTAGE: (int, 1000),
          },
          MODEL.SENSOR_HT: {VALUE.HUMIDITY: (int, 100),
          VALUE.TEMPERATURE: (int, 100),
          VALUE.VOLTAGE: (int, 1000),
          },
          MODEL.SMOKE: {VALUE.ALARM: (int, 1),
          VALUE.DENSITY: (int, 1),
          VALUE.VOLTAGE: (int, 1000),
          },
          MODEL.SWITCH: {VALUE.STATUS: (dict, {'click': ('click', '1'),
          'long_click_press': ('press', '1'),
          'long_click_release': ('press', '0')}),
          VALUE.CHANNEL_0: (dict, {'click': ('click', '1'),
          'long_click_press': ('press', '1'),
          'long_click_release': ('press', '0')}),
          VALUE.VOLTAGE: (int, 1000),
          },
          MODEL.WATER_LEAK: {VALUE.STATUS: (dict, {'no_leak': '0',
          'leak': '1'}),
          VALUE.VOLTAGE: (int, 1000),
          }
          
          }
          
          def cb(model, sid, cmd, data):
          # Focus only on report event, ignore heartbeats
          #if cmd != 'report':
          # return
          
          # Find device
          if model in MODEL_VALUES_MATRIX:
          # Read it's data values
          for k, v in (data or {}).items():
          # Check data values one by one and if known then prepare package
          if k in MODEL_VALUES_MATRIX.get(model):
          packet = None
          type, conv = MODEL_VALUES_MATRIX.get(model).get(k)
          
          # Integer value
          if type == int:
          packet = '%s %s %s %.2f' % (model, sid, k, type(v) / (conv or 1.0))
          
          # Dictionary
          if type == dict and v in conv:
          # Change key
          if isinstance(conv[v], tuple) and len(conv[v]) >= 2:
          packet = '%s %s %s %s' % (model, sid, conv[v][0], conv[v][1])
          # No conversion
          else:
          packet = '%s %s %s %s' % (model, sid, k, conv[v])
          
          # Send packet to Loxone
          if packet:
          sock.sendto(bytes(packet, 'utf-8'), (UDP_IP, UDP_PORT))
          
          connector = XiaomiConnector(data_callback=cb)
          
          while True:
          connector.check_incoming()
          Es geht natürlich um den Bereich "Motion".
          Zuletzt geändert von Sebastian; 06.01.2021, 13:49.

          Kommentar

          • AlexAn
            Lebende Foren Legende
            • 25.08.2015
            • 4456

            #6
            Nimm einfach das ZigBee2MQTT Plugin und binde es damit ein!
            https://www.loxwiki.eu/display/LOXBE...ee2MQTT+Plugin

            Sollte ähnlich sein:
            Xiaomi RTCGQ11LM control via MQTT | zigbee2mqtt.io
            Zuletzt geändert von AlexAn; 06.01.2021, 13:52.
            Grüße Alex

            Kommentar

            • Sebastian
              LoxBus Spammer
              • 28.08.2015
              • 244

              #7
              Dafür bräuchte ich noch einen Zigbee Adapter, richtig?

              Kommentar

            • Gast

              #8
              wäre das nicht direkt mit dem Mqtt Gateway machbar? Das Reset wäre dann schon implementiert. Brauchst auch kein Zigbee.


              Kommentar

              • AlexAn
                Lebende Foren Legende
                • 25.08.2015
                • 4456

                #9
                NodeRed ist bei solchen Geschichten einfacher als ein Script:
                node-red-contrib-xiaomi-miio (node) - Node-RED

                Das ganze am Besten per MQTT oder Loxone Node in den Miniserver schieben.
                Grüße Alex

                Kommentar

                • Sebastian
                  LoxBus Spammer
                  • 28.08.2015
                  • 244

                  #10
                  Hab keinen Plan wie ich das machen soll...

                  Meine erste Idee war ja, dass ich einen Timer einbaue. Also wenn eine Motion registriert und gesendet wurde, kommt eine Meldung nach 10 Sekunden hinterher, die den Status 0 setzt. Hab nur keinen Plan von Python...viel trial and error
                  Zuletzt geändert von Sebastian; 06.01.2021, 14:27.

                  Kommentar

                  • Christian Fenzl
                    Lebende Foren Legende
                    • 31.08.2015
                    • 11250

                    #11
                    Zumindest per UDP sollte es gehen (bin mir nicht ganz sicher - bei einer Art geht's, bei der anderen Art nicht...), da hast du in den Eigenschaften des Befehls "Als Digitaleingang verwenden". Probier mal aus, ob ein Impuls kommt, wenn du das setzt.
                    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                    Kommentar


                    • Sebastian
                      Sebastian kommentierte
                      Kommentar bearbeiten
                      Zunächst war der Wert auf 1, dann bei neuer Bewegung auf 0. Danach blieb er erneut bei neuen Bewegungen auf 0, kein Impuls mehr..

                    • Christian Fenzl
                      Christian Fenzl kommentierte
                      Kommentar bearbeiten
                      Einen Impuls siehst du nicht! Dafür musst du was anschließen, was auf den Impuls reagiert.
                  • Sebastian
                    LoxBus Spammer
                    • 28.08.2015
                    • 244

                    #12
                    Danke Leute, habs hinbekommen über Python .

                    Ich habe einfach nochmal das hinzugefügt in Zeile 111:

                    Code:
                     if model == 'motion' and v == 'motion':
                    packet = '%s %s %s %s' % (model, sid, k, '0')
                    time.sleep(2)
                    sock.sendto(bytes(packet, 'utf-8'), (UDP_IP, UDP_PORT))
                    Damit sendet er nur beim Motion Sensor noch einen Status 0 hinterher...
                    Zwar nicht ganz sauber, aber funktioniert.

                    Dann auch noch gleich für den Switch, da geht es nämlich nur beim LongPress:

                    Code:
                     if model == 'switch' and v == 'click':
                    packet = '%s %s %s %s' % (model, sid, v, '0')
                    time.sleep(0.45)
                    sock.sendto(bytes(packet, 'utf-8'), (UDP_IP, UDP_PORT))
                    Natürlich würde mich die Funktionsweise über MQTT trotzdem interessieren. :BEER:
                    Zuletzt geändert von Sebastian; 06.01.2021, 17:01.

                    Kommentar

                    Lädt...