Ankündigung

Einklappen
Keine Ankündigung bisher.

Message mit 2 byte in 16 bit wandeln

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

    Message mit 2 byte in 16 bit wandeln

    Hallo,

    ich teste aktuelle das 1w Gateway von Masifi (mehr hier). Das Gateway bietet 3 Kanäle mit je bis zu 10 Sensoren.
    In der letzten Firmware wurden die Errormessages implemtiert. Diese sind DPT7, müssen aber bitweise gelesen werden. An der Stelle mit "1" ist der Sensor fehlerhaft.

    Beispiele:
    • 0000001000 --> die "1" steht an 4. Stelle -> der Sensor4 hat einen Error.
    • Sensor 2 und Sensor 5 und Sensor 10 haben einen Fehler, dann wird eine Nachricht geschickt die so aussieht: 1000010010 --> an der zweiten, fünften und zehnten Stelle (von rechts) steht eine "1"
    Aktuell habe ich den Fall aus dem ersten Beispiel. Der Busmonitor sagt:

    Die Message selbst ist auch etwas komisch (zumindest für mich). Im CH1 fehlt Sensor 4. Im Busmonitor (DPT7) erscheint:
    # Zeit Dienst Flags Prio Quell-Adresse Quell-Name Ziel-Adresse Ziel-Name Rout Typ DPT Info
    6 21.07.2019 13:53:04,028 vom Bus Low 1.0.40 Dummy 0/3/136 1w Fehler CH1 6 GroupValueWrite 7.001 Pulse 00 08 | 8 pulses
    In shNG konnte ich bislang nur als Datentyp "foo" einlesen und bekomme die Zahl "8" geliefert.

    Wie kann ich das bitweise einlesen, um "0000001000" zu erhalten?
    Wer kann helfen?
    Danke Euch!
    Zuletzt geändert von Sisamiwe; 23.07.2019, 20:15.

    #2
    DPT 7.001 liefert per KNX Definition einen unsigned 16 Bit Wert. Dieser wird am besten in ein Item vom Typ num eingelesen. Danach kannst Du in einer Logik oder in einem eval Ausdruck diesen Wert umwandeln. Ihn in einen String aus Nullen und Einsen umzuwandeln ist dabei eher unpraktisch.

    Du kannst z.B. mit dem binären AND Operator die Information des Fehler Bits für Sensor 4 in ein eigenes Item isolieren:

    Code:
    from_knx:
        type: num
        knx_dpt: 7
        knx_listen: 0/3/136
    
    sensor4_error:
        type: bool
        eval: sh.from_knx() AND 0b00001000
    Alternativ zu der Angabe der Maske in binärer Form, kannst Du die Angabe auch hexadezimal machen, also statt 0b00001000 den Wert 0x08 verwenden.

    Viele Grüße
    Martin

    Stay away from negative people. They have a problem for every solution.

    Kommentar


      #3
      Msinn
      Danke.

      Ich habe das nun mal so umgesetzt:

      item.yaml
      Code:
      %YAML 1.1
      ---
      raumtemp:
          devices:
              type: foo
              onewire_gateway:
                  type: foo
                  ch1_error:
                      type: bool
                      from_knx:
                          type: num
                          knx_dpt: 7
                          knx_listen: 0/3/136
                      sensor1_error:
                          type: bool
                          eval: sh.raumtemp.devices.onewire_gateway.ch1_error.from_knx() AND 0b00000001
                          eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                      sensor2_error:
                          type: bool
                          eval: sh.raumtemp.devices.onewire_gateway.ch1_error.from_knx() AND 0b00000010
                          eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                      sensor3_error:
                          type: bool
                          eval: sh.raumtemp.devices.onewire_gateway.ch1_error.from_knx() AND 0b00000100
                          eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                      sensor4_error:
                          type: bool
                          eval: sh.raumtemp.devices.onewire_gateway.ch1_error.from_knx() AND 0b00001000
                          eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
      Im Busmonitor steht:
      # Zeit Dienst Flags Prio Quell-Adresse Quell-Name Ziel-Adresse Ziel-Name Rout Typ DPT Info
      38 21.07.2019 19:47:04,719 vom Bus Low 1.0.40 - 0/3/136 - 5 GroupValueResponse 7.001 Pulse 00 08 | 8 pulses

      Im Backend steht:
      Item-Informationen
      Pfad raumtemp.devices.onewire_gateway.ch1_error.from_kn x
      Name raumtemp.devices.onewire_gateway.ch1_error.from_kn x
      Typ (type) num
      Wert (value)
      Letztes Update 2019-07-21 19:46:54.707472+02:00
      Letzte Änderung 2019-07-21 19:44:14.892936+02:00
      Alter (Update) 33.27 Sekunden
      Alter (Änderung) 3 Minuten, 13.08 Sekunden
      Update durch knx:1.0.40:ga=0/3/136
      Geändert durch knx:1.0.40:ga=0/3/136
      vorheriger Wert 0
      vorheriges Update 2019-07-21 19:42:25.048387+02:00
      vorherige Änderung 2019-07-21 19:42:25.048387+02:00
      vorh. Alter (Update) 36.59 Sekunden
      vorh. Alter (Änderung) 36.59 Sekunden
      Bzgl. des eval gibt es für alle 4 items im Log eine Fehlermeldung:

      WARNING raumtemp.devices.onewire_gateway.ch1_error.sensor4 _error Item raumtemp.devices.onewire_gateway.ch1_error.sensor4 _error: problem evaluating sh.raumtemp.devices.onewire_gateway.ch1_error.from _knx() AND 0b00001000: invalid syntax (<string>, line 1)

      Kommt denn vom KNX überhaupt das richtige an? oder muss Masifi da nochmal nachschauen?

      Kommentar


        #4
        AND klein schreiben --> and . Hast Du mal value and 0b00000001 ausprobiert

        Kommentar


          #5
          Ich habe es in EDOMI so umgesetzt und das sieht soweit gut aus jetzt:

          https://knx-user-forum.de/forum/proj...-16bit-wandeln

          Kommentar


            #6
            AND kleingeschrieben (also "and") hilft. Dieser Fehler ist weg und das eval wird ausgeführt.
            Vom KNX kommt immer noch die "8" als Wert mit DPT7

            Das Eval bei Sensor 1 ergibt TRUE.
            Für die anderen 3 kommt eine Fehlermeldung.

            Im Log gibt es eine Fehlermeldung:
            Code:
            2019-07-21  20:30:44 WARNING  raumtemp.devices.onewire_gateway.ch1_error.sensor2_error Item raumtemp.devices.onewire_gateway.ch1_error.sensor2_error: value "2" does not match type bool. Via Eval raumtemp.devices.onewire_gateway.ch1_error.from_knx
            2019-07-21  20:30:44 WARNING  raumtemp.devices.onewire_gateway.ch1_error.sensor3_error Item raumtemp.devices.onewire_gateway.ch1_error.sensor3_error: value "4" does not match type bool. Via Eval raumtemp.devices.onewire_gateway.ch1_error.from_knx
            2019-07-21  20:30:44 WARNING  raumtemp.devices.onewire_gateway.ch1_error.sensor4_error Item raumtemp.devices.onewire_gateway.ch1_error.sensor4_error: value "8" does not match type bool. Via Eval raumtemp.devices.onewire_gateway.ch1_error.from_knx
            und es ist egal ob ich
            Code:
            eval: value and 0b00000001
            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
            oder

            Code:
            eval: sh.raumtemp.devices.onewire_gateway.ch1_error.from_knx() and 0b00000010
            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
            verwende.

            Kommentar


              #7
              True if value and 0b00000001 else False

              Kommentar


                #8
                Hi,

                ich glaube, dass läuft nur, wenn Du mit   assign_compatibility: compat_1.2  arbeitest. Siehe in der Doku unter https://www.smarthomeng.de/user/konf...-wertzuweisung.

                Gruß, Waldemar

                Kommentar


                  #9
                  Hallo,

                  Zitat von bmx Beitrag anzeigen
                  True if value and 0b00000001 else False
                  führt zu einem anderen Ergebnis, aber nicht zum gewünschten, leider:

                  item.yaml
                  Code:
                  raumtemp:
                      devices:
                          type: foo
                          onewire_gateway:
                              type: foo
                              ch1_error:
                                  type: bool
                                  from_knx:
                                      type: num
                                      knx_dpt: 7
                                      knx_listen: 0/3/136
                                  sensor1_error:
                                      type: bool
                                      eval: True if value and 0b00000001 else False
                                      eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                                  sensor2_error:
                                      type: bool
                                      eval: True if value and 0b00000010 else False
                                      eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                  Das Item raumtemp.devices.onewire_gateway.ch1_error.from_kn x erhält den Wert "8".
                  Die sensorX_error werden alle true.

                  Zitat von mumpf Beitrag anzeigen
                  ich glaube, dass läuft nur, wenn Du mit assign_compatibility: compat_1.2 arbeitest. Siehe in der Doku unter
                  Ist das nicht die Standardeinstellung?

                  Michael

                  Kommentar


                    #10
                    Hi Michael,

                    ​​​​​​da mein Python nicht so gut ist, hab ich Mal bei Google nach "Python binary Operator" geschaut und sofort gesehen, dass das binäre UND als & notiert wird.

                    Versuch es damit, dann wird das schon was. Wahrscheinlich musst du in yaml dann die rechte Seite von eval in Anführungszeichen setzen.

                    Gruß, Waldemar

                    ​​

                    Kommentar


                      #11
                      Tja, der Waldemar hat wohl Recht mit dem und da habe ich auch nicht mehr dran gedacht

                      Kommentar


                        #12
                        Hallo,
                        die Lösung ist, wie Waldemar mumpf geschrieben hat, das "&".

                        Code:
                        %YAML 1.1
                        ---
                        raumtemp:
                            devices:
                                type: foo
                                onewire_gateway:
                                    type: foo
                                    ch1_error:
                                        type: bool
                                        from_knx:
                                            type: num
                                            knx_dpt: 7
                                            knx_listen: 0/3/136
                                        sensor1_error:
                                            type: bool
                                            eval: "True if value & 0b00000001 else False"
                                            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                                        sensor2_error:
                                            type: bool
                                            eval: "True if value & 0b00000010 else False"
                                            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                                        sensor3_error:
                                            type: bool
                                            eval: "True if value & 0b00000100 else False"
                                            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                                        sensor4_error:
                                            type: bool
                                            eval: "True if value & 0b00001000 else False"
                                            eval_trigger: raumtemp.devices.onewire_gateway.ch1_error.from_knx
                        Danke an alle!

                        Kommentar


                          #13
                          Hi,

                          noch eine kleine Vereinfachung:
                          Code:
                          eval: "value & 0b00000001"
                          eval_trigger: ..from_knx
                          Ist meiner Meinung nach übersichtlicher, ist aber Geschmackssache.

                          Gruß, Waldemar

                          Kommentar


                            #14
                            mumpf
                            Nehme ich gern mit auf. DANKE

                            Kommentar


                              #15
                              Hallo,
                              ich muss das nochmal aufwärmen, denn die Fehlermeldung bei mehreren Defekten klappt noch nicht.

                              Es geht um das Fehlermeldungen des Konnekting 1w Gateways. Das Gateway bietet 3 Kanäle mit je je 14 Sensoren.
                              Die Errormessage ist pro Kanal eine DPT7 (16bit unsigned). Dabei repäsentieren die 16 Stellen von rechts beginnend die Sensoren (1. Stelle von rechts -> Sensor 1, usw). An der Stelle mit "1" ist der Sensor fehlerhaft.

                              Beispiele:
                              • 0000001000 --> die "1" steht an 4. Stelle -> der Sensor4 hat einen Error.
                              • Sensor 2 und Sensor 5 und Sensor 10 haben einen Fehler, dann wird eine Nachricht geschickt die so aussieht: 1000010010 --> an der zweiten, fünften und zehnten Stelle (von rechts) steht eine "1"

                              Die aktuelle Implementierung ist:
                              Code:
                              onewire_gateway:
                                          type: foo
                                          alive:
                                              type: bool
                                              knx_dpt: 1
                                              knx_cache: 0/3/143
                                          ch1_error:
                                              type: bool
                                              eval: or
                                              eval_trigger:
                                                - .sensor1_error
                                                - .sensor2_error
                                                - .sensor3_error
                                                - .sensor4_error
                                                - .sensor5_error
                                                - .sensor6_error
                                                - .sensor7_error
                                                - .sensor8_error
                                                - .sensor9_error
                                                - .sensor10_error
                                                - .sensor11_error
                                                - .sensor12_error
                                                - .sensor13_error
                                                - .sensor14_error
                                              from_knx:
                                                  type: num
                                                  knx_dpt: 7
                                                  knx_cache: 0/3/136
                                              sensor1_error:
                                                  type: bool
                                                  eval: "value & 0b00000001"
                                                  eval_trigger: ..from_knx
                                              sensor2_error:
                                                  type: bool
                                                  eval: "value & 0b00000010"
                                                  eval_trigger: ..from_knx
                                              sensor3_error:
                                                  type: bool
                                                  eval: "value & 0b00000100"
                                                  eval_trigger: ..from_knx
                                              sensor4_error:
                                                  type: bool
                                                  eval: "value & 0b00001000"
                                                  eval_trigger: ..from_knx
                                              sensor5_error:
                                                  type: bool
                                                  eval: "value & 0b00010000"
                                                  eval_trigger: ..from_knx
                                              sensor6_error:
                                                  type: bool
                                                  eval: "value & 0b00100000"
                                                  eval_trigger: ..from_knx
                                              sensor7_error:
                                                  type: bool
                                                  eval: "value & 0b01000000"
                                                  eval_trigger: ..from_knx
                                              sensor8_error:
                                                  type: bool
                                                  eval: "value & 0b10000000"
                                                  eval_trigger: ..from_knx
                                              sensor9_error:
                                                  type: bool
                                                  eval: "value & 0x100"
                                                  eval_trigger: ..from_knx
                                              sensor10_error:
                                                  type: bool
                                                  eval: "value & 0x200"
                                                  eval_trigger: ..from_knx
                                              sensor11_error:
                                                  type: bool
                                                  eval: "value & 0x400"
                                                  eval_trigger: ..from_knx
                                              sensor12_error:
                                                  type: bool
                                                  eval: "value & 0x800"
                                                  eval_trigger: ..from_knx
                                              sensor13_error:
                                                  type: bool
                                                  eval: "value & 0x1000"
                                                  eval_trigger: ..from_knx
                                              sensor14_error:
                                                  type: bool
                                                  eval: "value & 0x2000"
                                                  eval_trigger: ..from_knx
                              Wie gesagt, es funktioniert nicht richtig, wenn mehrere Sensoren defekt sind. Vom knx kommt bspw "3" in dezimalt, was in binär 16bit unsigned "00000000 00000011" bedeutet, also Sensor 1 und 2 sind fehlerhaft, Sensoren 3-14 fehlerfrei.

                              Wie bekomme ich das in Python bzw. shNG aufgelöst, so dass ich die aus der Fehlermeldung die entsprechenden Sensoren auslesen kann?
                              Danke Euch.

                              Kommentar

                              Lädt...
                              X