Ankündigung

Einklappen
Keine Ankündigung bisher.

groupreadresponse to variable

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

    groupreadresponse to variable

    Hallo zusammen

    Ich möchte gerne mein Satus (Wert) in eine Variable schreiben und diesen in einer Bash weiter verarbeiten können.

    Code:
    #!/bin/bash
    groupreadresponse ip:localhost 1/2/110
    Resultat

    Send request
    Read from 0.0.0
    Response from 1.1.13: 01


    irgend wie so:
    Code:
    groupreadresponse ip:localhost 1/2/110 > $knxresult
    
    print=$knxresult
    01

    Wie ist das am einfachste zu bewerkstelligen

    Danke für einen kleinen Tipp

    Martin
    Zuletzt geändert von mwfv; 18.06.2016, 15:33.

    #2
    Huh, dein Vorschlag tut so nicht wirklich.

    Der >-Operator leitet in eine Datei um.

    Hier ein Auszug aus meinem Script um einen Status (ich nutze da nur 1-bit) in eine Variable zu lesen:

    Code:
    STATUS="$(groupreadresponse ip:192.168.0.100 "$READADDR"|grep '^Response'|cut -d ':' -f 2)"
    Dann enthält $STATUS den Wert vom KNX.

    Kommentar


      #3
      Vielen Dank für Deinen Tipp, genau das habe ich gesucht

      Kommentar


        #4
        Hallo,

        ich habe ein ähnliches Vorgaben und komme nicht weiter.
        In einem kleinen C++ - Programm möchte ich mittels eibd auf den knx-Bus zugreifen.
        Schreiben funktioniert wunderbar mit

        system("groupswrite ip:localhost 3/1/6 1");

        Lesen möchte ich nun von GA 1/5/0 einen Zähler-Wert (4 Byte vorzeichenlos DPT 12.001).
        Hierzu bin ich über die SuFu auf groupreadresponse gestoßen und habe folgendes probiert:

        system("groupreadresponse ip:localhost 1/5/0");

        Als Ausgabe auf der Kommandozeile erhalte ich:

        Send request
        Read from 0.0.0
        Response from 1.1.3: 00 00 14 96

        Wenn ich den hex-Wert 0x1496 in dez umwandle erhalte ich 5270, was dem aktuellen Zählerstand laut ETS entspricht.
        Also lesen scheint prinzipiell zu funktionieren, doch wie schaffe ich es, in c++ den ausgelesenen Wert in eine unsigned int-Variable zu schreiben?

        Wer hat eine Idee und kann helfen? Danke

        Kommentar


          #5
          Nun, wer freiwillig C++ verwendet sollte entweder programmieren können oder auf die Nase fallen...

          Also der Algorithmus ist ja oben aus meinem Code erkennbar:
          * lese alle Zeilen nacheinander ein bis eine mit "Response" startet.
          * Werfe von dieser Zeile alles bis einschließlich dem Doppelpunkt weg
          * Vom Rest entfernen wir noch alle Leerzeichen
          * Dann googlen wir nach eine Methode wie man aus einer Hex-Zahl in einem String eine unsigned int bekommt.

          Wie man das jetzt in C++ macht ist reine Fleißarbeit.

          Kommentar


            #6
            Zitat von bwurst Beitrag anzeigen
            Wie man das jetzt in C++ macht ist reine Fleißarbeit.
            Ja. Und mit std::string geht das schon mal viel, viel besser als mit C und strtok und Konsorten ...

            Andererseits: Wenn man schon C/C++ verwendet, warum dann nicht gleich gegen libeibclient linken und sich die system Aufrufe ganz sparen?
            I am hoping the Internet of Incompatible Things mitigates the bad effects of the Internet of Insecure Things.

            Kommentar


              #7
              Zitat von bwurst Beitrag anzeigen
              Nun, wer freiwillig C++ verwendet sollte entweder programmieren können oder auf die Nase fallen...
              Vielen Dank für den überhaus hilfreichen Kommentar! Wenn Du dazu nichts beitragen kannst, musst Du auch nicht antworten.

              Es scheitert nicht am string bearbeiten, sondern am Verständnis, wie ich den Rückgabewert von groupreadresponse in einen string bekomme.


              @hthoma: die system-Aufrufe waren nur Mittel zum Zweck. Wenn es hier etwas anderes gibt...gerne. Sollte halt auf dem Raspi lauffähig sein.

              Kommentar


                #8
                Der system Aufruf gibt Dir nur den return status code zurück. Wenn Du den Test auswerten willst, den das Kommando schreibt, dann kannst Du mit Ausgabeumleitung arbeiten. Zum Beispiel mal sowas probieren:

                system("groupreadresponse ip:localhost 1/5/0 > /tmp/knx.txt");

                Dann sollte die Ausgabe von groupreadresponse in /tmp/knx.txt stehen.

                Alternativ kannst Du Dir mal den Quelltext von groupreadresponse anschauen: https://github.com/knxd/knxd/blob/ma...readresponse.c
                So kompliziert schaut das nicht aus. Das könntest Du dann in Deinem C++ Programm auch selbst machen und den Umweg über system und die tmp Datei sparen.
                I am hoping the Internet of Incompatible Things mitigates the bad effects of the Internet of Insecure Things.

                Kommentar

                Lädt...
                X