Ankündigung

Einklappen
Keine Ankündigung bisher.

RFID und Logik

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

    RFID und Logik

    Hallo,

    ich habe einen RFID-Leser, der über MQTT Daten an mein System sendet. Sobald ich aber Smarthome neu starte, wird einmal die Aktion ausgelöst.
    Was muss ich ändern, um dieses zu verhindern? Die Init in der Item-Def sind dort drin, weil ich damit in der Logic durch das IF die Auslösung verhindern wollte, das hat aber nicht geklappt.
    Ich habe die ItemDefiinition und die Logic angehängt:

    Item-Def:
    Code:
    transponder:
      rfid: 
        uid:
          type: str
          sv_widget: "{{ basic.print('uid', 'item', '') }}"
          influxdb: 'true'
          enforce_updates: 'true'
          mqtt_topic_in: /rfid/uid/value/
          # mqtt_topic_out: /rfid/uid/value/
          mqtt_topic_init: '00000' 
          init: '00000'
    
    licht:
      testraum:
         type: bool
         knx_dpt: 1
         knx_listen: 5/0/2
         knx_send: 5/0/0
         knx_init: 5/0/2
         cache: 'on'
         nw: 'yes'
         initial_value: true
         # nach 10 Minuten automatisch aus
         autotimer: 10m = 0
         influxdb: 'true'
    Logik:
    Code:
    # get triggering item
    trigger_source = trigger['source']
    trigger_item = sh.return_item(trigger_source)
    
    # changed_by wird benötigt um nicht rekursiv aufgerufen zu werden
    changed_by = trigger_item.changed_by()
    
    logger.info('transponder triggered by '+trigger_source+' changed by '+changed_by)
    logger.info('Transponder value ' + trigger_item())
    
    if trigger_source.endswith('uid') and not changed_by.startswith('transponder'):
      parent_item = trigger_item.return_parent()
      if trigger_source.endswith('uid'):
         if trigger_item() == '12345' :
            logger.info(' transponder 12345')
            sh.licht.testraum('True')
    
    trigger_item('0',caller='transponder',source='transponder')

    #2
    Was soll init im uid Item tun? Ein solches Attribut gibt es in SmartHomeNG nicht. (Einfach mal in die Doku schauen).

    Ob, wann und von wem das uid Item einen Wert erhalten hat, kannst Du in der Admin GUI im Item Tree sehen.

    Eine Angabe sehe ich nicht: Wie wird die Logik denn getriggert?

    weiter Frage: Wozu brauchst Du die Logik überhaupt? Und setzt das testraum Item nicht über eval oder über on_update?
    Zuletzt geändert von Msinn; 12.10.2020, 12:34.
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Das mit dem Init war noch ein Merker für mich, sollte als Kommentar und wurde aber inzwischen durch mqtt_topic_init gefüllt.

      in der logic.yaml steht:
      Code:
      transponder:
          filename: transponder.py
          watch_item: '*.rfid.*'
      Meiner Meinung gehört irgendein If in den Code, der auf changed_by abfragt. Ich weiß aber nicht was?

      Ich brauche die Logic, da ich mehrere RFID-Transponder verwende und diese dann auch aus der Logic wieder heraus nehmen kann, sollte mal einer verloren gehen.
      So kann ich in der Logic auf mehrere verschiedene Aktion, abhängig von der Transponder-ID auslösen. Nur da obiger Code noch nicht läuft, macht das noch keinen Sinn.
      (Ich wüsste auch nicht, wie ich dynamischen Code schreiben sollte, den ich über die Oberfläche fülle, der bei unterschiedlichen RFIDs unterschiedliche Items anspricht, das wäre natürlich die Luxus Lösung.)

      Obige (abgespeckte) Datei verhält sich schon anders als ich es erwarte, da brauche ich dann für meine Frage nicht eine Aneinanderreihung von ähnlichen If-Statements (mit unterschiedlichen IDs und unterschiedlichen Items), die nicht zum weiteren Verständnis nötig sind und die Frage nur aufblähen würden.

      Gruss

      Kommentar


        #4
        Jetzt hast Du mich völlig verloren. Ich verstehe im Moment weder was Du erreichen willst noch genau Dein Problem.
        Viele Grüße
        Martin

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

        Kommentar


          #5
          Ich möchte über einen RFID Tag bzw über einen MQTT Code einen Verbraucher schalten. (ZB Öffner für das Gartentor).

          beim Neustart von smarthomeng wird das Item immer einmal aktiv und ich weiß nicht warum.

          Gruss

          Kommentar


            #6
            Vl wegen knx init? Und initial value true?

            Kommentar


              #7
              Nein leider nicht. Wenn ich den mqtt_topic_in raus nehme, wird nichts gestartet. Deshalb setze ich ja schon bewusst nach einem gültigen Tag einen 0-Wert. Der eigentlich nichts auslösen sollte.

              doch leider hilft das nicht.
              Es müsste wahrscheinlich in die Logik etwas, dass beim Start (Init) den Code überspringt.

              gruss

              Kommentar


                #8
                Bei mir sehen Logiken in etwa so aus:

                Code:
                class LeaveLogic(Exception): pass  # declare a label
                
                try:
                    # to get access to the object instance:
                    from lib.shtime import Shtime
                    shtime = Shtime.get_instance()
                
                    status = sh.shng_status['code']
                    if status != 20:
                        logic.logger.debug('Logik ignoriert, SmartHomeNG läuft noch nicht (Status={}'.format(status))
                        raise LeaveLogic()
                
                    by = trigger.get('by', '')
                    source = trigger.get('source', '')
                    dest = trigger.get('dest', '')
                    value = trigger.get('value', '')
                    logic.logger.debug('Aufruf Logik Rolladen Schlafzimmer öffnen (trigger[by={}, source={}, dest={}, value={}])'.format(by,source,dest,value))
                
                    # hier der Rest der Logik...
                
                except LeaveLogic:  # where to goto
                    pass
                
                except Exception as e:
                    logic.logger.error("Es ist ein Fehler '{}' aufgetreten".format(e))

                Kommentar


                  #9
                  Danke.

                  da stecken auf jeden Fall viele Informationen drin. ich werde das mal bei mir anpassen und müsste mit den zusätzlichen Log-Ausgaben dann weiter kommen.

                  Kommentar


                    #10
                    Frage am Rande, was für einen Leser hast Du denn, der sich da anbinden lässt?
                    never fummel a running system...

                    Kommentar


                      #11
                      Hallo,

                      Zitat von TRex Beitrag anzeigen
                      Frage am Rande, was für einen Leser hast Du denn, der sich da anbinden lässt?
                      ich. benutze einen einfachen RFID-RC522 mit einem esp8266. Dieser sendet dann MQTT Messages mit der RFID. Das Gehäuse für den Leser habe ich bei Thingiverse abgelegt.
                      Ich hoffe der Link ist erlaubt: https://www.thingiverse.com/thing:4060184

                      Kommentar


                        #12
                        Zu meinem eigentlichen Problem:
                        Code:
                        mqtt_topic_in: /rfid/uid/value/
                        diese Zeile in der Item Definition startet das Subscribe und der MQTT Server schickt darauf hin den letzten Wert (payload) als Message, welche das Item auslöst.

                        Meine Lösung: Der EP8266 sendet nach der Übertragung einen ungültigen Dummywert, dadurch wird dieser bei einem Neustart beim subscribe gesendet und nichts passiert. Bei RFID wird der Status nur beim lesen eines Tags gesetzt. Wodurch der letzte Wert beim Subscribe wieder in der Message landet.

                        Gruss

                        Kommentar


                          #13
                          Das Topic mqtt_topic_in sorgt nur für den Empfang von danach gesendeten MQTT Messages. Falls Du daraufhin direkt eine Message erhältst hast Du evtl. Deinen Sensor am ESP8266 mit gesetztem Retain Flag konfiguriert? In dem Fall sendet der Broker beim Connect die Message erneut an SmartHomeNG.
                          Viele Grüße
                          Martin

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

                          Kommentar


                            #14
                            OK. Da steht in der Tat ein true für retain drin. Ich werde das mal ändern. Danke für den Tip. Da habe ich dann an falscher Stelle gesucht.

                            Kommentar

                            Lädt...
                            X