Ankündigung

Einklappen
Keine Ankündigung bisher.

Strings in KNX GAs schreiben

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

    #16
    Zitat von japhias Beitrag anzeigen
    sollte man es gänzlich vermeiden Strings auf den Bus zu senden?
    Du hast aber schon meine Postings gelesen, oder?

    Selbstverständlich kannst Du auf den Bus Strings schreiben, so viele Du willst. Ich habe nur geschrieben, dass openHAB nur den DPT16 unterstützt, aber nicht DPT24. Damit ist die Länge des Strings auf 14 Zeichen begrenzt.
    Solange also Deine Strings nicht länger als 14 Zeichen sind, hast Du kein Problem.

    Allgemein ist knx aber ein Steuerbus, der nicht dazu gedacht ist, lange Texte zu übertragen (auch wenn das mit DPT24 möglich ist).

    Kommentar


      #17
      Ich habe gerade versucht nach obigem Beispiel eine String Variable an eine KNX Variable zu übertragen und bekomme folgenden Eintrag im Log:

      Code:
       [COLOR=#6a9955]2019-12-25[/COLOR][COLOR=#6a9955]14:48:45.824[/COLOR][COLOR=#ce9178][B][ERROR][/B][/COLOR][COLOR=#d4d4d4] [[/COLOR][COLOR=#569cd6]ntime.internal.engine.RuleEngineImpl[/COLOR][COLOR=#d4d4d4]] - Rule [/COLOR][COLOR=#ce9178]'Radiostation Bad an knx senden'[/COLOR][COLOR=#d4d4d4]: An error occurred during the script execution: Could not invoke method: [/COLOR][COLOR=#569cd6]org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#569cd6]org.eclipse.smarthome.core.items.Item[/COLOR][COLOR=#d4d4d4],[/COLOR][COLOR=#569cd6]java.lang.String[/COLOR][COLOR=#d4d4d4]) on instance: [/COLOR][COLOR=#569cd6]null[/COLOR]
      Die Rule sieht so aus:

      Code:
       [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Radiostation Bad an knx senden"[/COLOR]
        [COLOR=#c586c0]when[/COLOR]
        [COLOR=#569cd6]Item[/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4] changed[/COLOR]
        [COLOR=#c586c0]then[/COLOR]
        [COLOR=#4ec9b0]Echo_Bad_Title_KNX[/COLOR][COLOR=#d4d4d4].sendCommand([/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4].state)[/COLOR]
        [COLOR=#c586c0]end[/COLOR]
      Item und Thing:

      Code:
       [COLOR=#569cd6]String[/COLOR][COLOR=#4ec9b0]Echo_Bad_Title_KNX[/COLOR][COLOR=#ce9178]"EchoBad"[/COLOR][COLOR=#d4d4d4]     ([/COLOR][COLOR=#4ec9b0]Echo_Bad[/COLOR][COLOR=#d4d4d4])        { [/COLOR][COLOR=#c586c0]channel[/COLOR][COLOR=#d4d4d4]=[/COLOR][COLOR=#ce9178]"knx:device:bridge:generic:Echo_Bad_Title_KNX"[/COLOR][COLOR=#d4d4d4]}[/COLOR]
          [COLOR=#4ec9b0]Type[/COLOR][COLOR=#d4d4d4] string-control[/COLOR][COLOR=#c586c0]:[/COLOR][COLOR=#4ec9b0]Echo_Bad_Title_KNX[/COLOR][COLOR=#ce9178]"Anzeige GT Bad"[/COLOR][COLOR=#d4d4d4]           [ga=[/COLOR][COLOR=#ce9178]"16.000:<0/7/4"[/COLOR][COLOR=#d4d4d4]][/COLOR]
      Die Fehlermeldung sagt mir leider gar nichts

      Kann es sein, wenn das Openhab Item mehr als 14 Zeichen enthält (ist ggf. der Fall) die Übertragung gar nicht abläuft, also der Text nicht abgeschnitten wird und nicht "nur" die ersten 14 Zeichen übertragen werden ?
      Wenn dem so ist, kann dann das openhab Item auf 14 Zeichen begrenzt werden?
      Oder habe ich generell noch einen Fehler, den ich nicht sehe?

      openHAB 2.4.0-1 (Release Build) auf Raspberry 4
      Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
      Albert Einstein

      Kommentar


        #18
        Ja, das kann durchaus sein. Um sicher nur die ersten 14 Zeichen zu übertragen kannst Du die Rule leicht abändern:
        Code:
        rule"Radiostation Bad an knx senden"
        when
            ItemEcho_Bad_Title changed
        then
            Echo_Bad_Title_KNX.sendCommand(Echo_Bad_Title.state.toString.substring(0,14))
        end
        Zuletzt geändert von udo1toni; 29.12.2019, 23:23.

        Kommentar


          #19
          Zitat von Tom0101 Beitrag anzeigen
          [ga="16.000:<0/7/4"]
          […]
          Oder habe ich generell noch einen Fehler, den ich nicht sehe?
          Hat es einen Besonderen Grund warum Du "<" verwendet hast?
          Nach meiner Interpretation von https://www.openhab.org/addons/bindi...dress-notation sollte das nicht verwendet werden, wenn Du auf diese Adresse schreiben willst. Ggf. wäre hier auch die Nutzung eines String-Control typen sinnvoll?

          Kommentar


            #20
            < bedeutet lediglich, dass openHAB initial versucht, den Status des Channels über diese GA zu erfragen (oder auf Englisch, openHAB sendet einen ReadRequest). Im laufenden Betrieb hat das < keinen Einfluss, es sei denn, man hat noch einen readInterval > 0 gesetzt, dann versucht openHAB, zyklisch zu lesen. Sollte ebenfalls keinen Einfluss auf die Funktion haben.

            Kommentar


              #21
              Danke für den Tipp, bin leider jetzt erst dazu gekommen es auszuprobieren

              Zitat von udo1toni Beitrag anzeigen
              Ja, das kann durchaus sein. Um sicher nur die ersten 14 Zeichen zu übertragen kannst Du die Rule leicht abändern:
              Habe die Rule jetzt so drin:
              Code:
               [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Radiostation Bad an knx senden"[/COLOR]
                [COLOR=#c586c0]when[/COLOR]
                [COLOR=#569cd6]Item[/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4] changed[/COLOR]
                [COLOR=#c586c0]then[/COLOR]
                [COLOR=#4ec9b0]Echo_Bad_Title_KNX[/COLOR][COLOR=#d4d4d4].sendCommand([/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4].state.toString.substring([/COLOR][COLOR=#b5cea8]0[/COLOR][COLOR=#d4d4d4],[/COLOR][COLOR=#b5cea8]14[/COLOR][COLOR=#d4d4d4]))[/COLOR]
                [COLOR=#d4d4d4]    logInfo([/COLOR][COLOR=#ce9178]"Echo_Bad_Title"[/COLOR][COLOR=#d4d4d4],[/COLOR][COLOR=#ce9178]"Rule Radiostation Bad an knx senden getriggert"[/COLOR][COLOR=#d4d4d4])[/COLOR]
                [COLOR=#c586c0]end[/COLOR]
              Bekomme aber leider nicht die gewünschte Funktion.

              Log Eintrag ist :
              Code:
              [COLOR=#6a9955]2020-01-04[/COLOR][COLOR=#6a9955]19:28:40.325[/COLOR][COLOR=#ce9178][B][ERROR][/B][/COLOR][COLOR=#d4d4d4] [[/COLOR][COLOR=#569cd6]ntime.internal.engine.RuleEngineImpl[/COLOR][COLOR=#d4d4d4]] - Rule [/COLOR][COLOR=#ce9178]'Radiostation Bad an knx senden'[/COLOR][COLOR=#d4d4d4]: String index out of range: [/COLOR][COLOR=#569cd6]14[/COLOR]
              Die Rule an sich läuft, ich bekomme jedenfalls die "Trigger loginfo" jedesmal angezeigt.
              Zuletzt geändert von Tom0101; 04.01.2020, 19:44.
              Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
              Albert Einstein

              Kommentar


                #22
                Ja, Denkfehler... Der String kann natürlich auch kürzer als 14 Zeichen sein. Dann so:
                Code:
                rule"Radiostation Bad an knx senden"
                when
                    ItemEcho_Bad_Title changed
                then
                    var Number nLen = 14
                    if(Echo_Bad_Title.state.toString.getBytes.size < nLen) nLen = Echo_Bad_Title.state.toString.getBytes.size
                    Echo_Bad_Title_KNX.sendCommand(Echo_Bad_Title.state.toString.substring(0,nLen))
                    logInfo("Echo_Bad_Title","Rule Radiostation Bad an knx senden getriggert")
                end
                Eventuell geht statt .substring(0,nLen) auch .left(nLen)

                Kommentar


                  #23
                  Vielen Dank nochmal, du bist ein Held udo1toni

                  Es funktionieren beide Varianten, ich habe jetzt .left(nLen) drin gelassen.

                  VS Code zeigt mir allerdings unter der Variablen nlen eine Wellenlinie und wenn ich mit dem Cursor drauf gehe diese Info.

                  Type mismatch: cannot convert from Number to int(org.eclipse.xtext.xbase.validation.IssueCodes.inc ompatible_types)

                  Im OH log sind jedenfalls keine ERROR Einträge mehr und die Rule funktioniert, soweit ich es momentan beurteilen kann einwandfrei.
                  Zuletzt geändert von Tom0101; 05.01.2020, 12:23.
                  Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                  Albert Einstein

                  Kommentar


                    #24
                    Ah, ja, stimmt natürlich... Es sollte reichen, diese Zeile zu ändern:
                    Code:
                    var Number nLen = 14
                    in
                    Code:
                    var Integer nLen = 14

                    Kommentar


                      #25
                      Nochmal tausend Dank, jetzt ist es perfekt.

                      Hier nochmal für alle, die die selbe Aufgabe lösen wollen die komplette Rule:

                      Code:
                       [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Radiostation Bad an knx senden"[/COLOR]
                        [COLOR=#c586c0]when[/COLOR]
                        [COLOR=#d4d4d4]    [/COLOR][COLOR=#569cd6]Item[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4] changed[/COLOR]
                        [COLOR=#c586c0]then[/COLOR]
                        [COLOR=#d4d4d4]    [/COLOR][COLOR=#569cd6]var[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#4ec9b0]Integer[/COLOR][COLOR=#d4d4d4] [/COLOR][COLOR=#4ec9b0]nLen[/COLOR][COLOR=#d4d4d4] = [/COLOR][COLOR=#b5cea8]14[/COLOR]
                        [COLOR=#d4d4d4]    [/COLOR][COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4].state.toString.getBytes.size < [/COLOR][COLOR=#4ec9b0]nLen[/COLOR][COLOR=#d4d4d4]) [/COLOR][COLOR=#4ec9b0]nLen[/COLOR][COLOR=#d4d4d4] = [/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4].state.toString.getBytes.size[/COLOR]
                        [COLOR=#d4d4d4]    [/COLOR][COLOR=#4ec9b0]Echo_Bad_Title_KNX[/COLOR][COLOR=#d4d4d4].sendCommand([/COLOR][COLOR=#4ec9b0]Echo_Bad_Title[/COLOR][COLOR=#d4d4d4].state.toString.left([/COLOR][COLOR=#4ec9b0]nLen[/COLOR][COLOR=#d4d4d4]))[/COLOR]
                        [COLOR=#c586c0]end[/COLOR]
                      Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                      Albert Einstein

                      Kommentar


                        #26
                        Hallo,

                        ich möchte das Thema nochmal aufgreifen. Ich habe in ETS eine Gruppenadresse angelegt und mit dem "Statustext 1 - Eingang" des Glastasters verknüpft.
                        in der .things Datei habe ich diese Zeilen eingetragen:

                        Thing device MDT_GLASTASTER_1_1_29 "MDT BE-GT22TW.01 (1.1.29) /Flur, Obergeschoss/" []
                        {
                        Type number : mdt_glastaster_2_smart_temp "Temperaturwert senden" [ ga="9.001:<3/4/2" ]
                        Type string : mdt_glastaster_2_smart_text "Text an Glastaster(OG) senden" [ ga="16.000:<5/3/0" ]
                        }

                        jedoch bekomme ich keinen Text am Glastaster ausgegeben mit "sendCommand"
                        hat jemand eine Idee?​

                        Kommentar

                        Lädt...
                        X