MQTT Anfängerfragen

  • Moin, ich habe mir mosquitto installiert und kann Nachrichten senden und empfangen.

    Aber wo werden die Nachrichten gespeichert, ich kann nirgends den Topic auf der Platte finden !? :conf:

    Wie kann ich eine Nachricht aus einer Datei auslesen und versenden ? :denker:

    Frage 2 hat sich mit dem Parameter -f erledigt:

    mosquitto_pub -h 192.168.0.240 -t topic -f /pfad/zur/nachricht.txt -u benutzer -P geheim

    Dafür tut sich jetzt das nächste Problem auf, ich empfange die Nachricht und speichere sie so in eine Datei:

    mosquitto_sub -t topic -u benutzer -P geheim > /pfad/zur/nachricht.txt &

    Jetzt wird die letzte Nachricht aber nicht überschrieben, sondern in eine neue Zeile angehängt:

    Code
    Nachricht
    Nachricht
    Nachricht
    ...
    Nachricht
    Nachricht
    Nachricht

    Lässt sich das ändern ?

    :helpnew:

    MfG

  • Hallo,


    Quote

    Jetzt wird die letzte Nachricht aber nicht überschrieben, sondern in eine neue Zeile angehängt:

    Das ist ein eine Sache der Shell und nicht von MQTT. Das von dir gezeigte Verhalten sollten aber nicht sein, weil die Umleitung mit `>` die Datei neu anlegt falls nicht existent und überschreibt falls existent. Es sein denn, deine Bash wird mit der Option `-C` (noclobber) aufgerufen.


    Gruß, noisefloor

  • Lässt sich das ändern ?

    mit tail


    da kannst du selber bestimmen wie viele VORZEILEN stehen bleiben sollen


    Für mein ICY NAS 2001 musste man das mit Linux Boardmitteln nachbauen so das diese Datei immer nur diie letzten 100 Zeilen zeigt

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Gerade deshalb glaube ich, dass es Sache von MQTT ist und nicht der shell und er sich alle Nachrichten irgendwie merkt und die neueste dazu hinterherschiebt.

    jar Um das rausfiltern der letzten Nachricht geht es mir nicht, dass ist das wenigste:

    PHP
    <?php
    $wert = file_get_contents('/pfad/zur/nachricht.txt', FALSE, NULL, -6);
    echo $wert;
    ?>

    Es geht darum, dass die Dateien unnötig immer größer werden.

  • mosquitto_sub -t topic -u benutzer -P geheim > /pfad/zur/nachricht.txt &

    Das startet den Listener im Hintergrund einmal und der läuft solange Du ihn nicht stoppst.


    Wenn Du Einzelsätze verarbeiten willst dann ungefähr so:

    Code
    mosquitto_sub ... | \
    while read msg; do
        echo $msg
    done
  • Hast du da den falschen Link geschickt, oder wobei soll mir der helfen ?

    da kannst du dir zur Not dein tail selber bauen und festlegen wieviel alte Zeilen stehen bleiben sollen, zur Not auch nur eine Zeile, denn ich verstand dich so als wenn du nur die letzte Änderung sehen willst und nicht das die Datei immer länger wird durch anhängen.

    Es geht darum, dass die Dateien unnötig immer größer werden.

    und genau das kannst du doch damit machen!

    Deswegen weil das NAS auf Linux lief und die immer größer werdende Datei irgendwann den Speicher killte musste abgeschnitten werden und da tail nicht auf dem eingesetzten Linux in der ICY-Box vorhanden war haben wir es nachgebaut!


    Keine Sorge ich verstehe dich auch nie :lol::baeh2:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Dafür tut sich jetzt das nächste Problem auf, ich empfange die Nachricht und speichere sie so in eine Datei:

    mosquitto_sub -t topic -u benutzer -P geheim > /pfad/zur/nachricht.txt &

    Jetzt wird die letzte Nachricht aber nicht überschrieben, sondern in eine neue Zeile angehängt:


    Das Kommando macht nicht, was du dir vorstellst. mosquitto_sub, in der Art aufgerufen, empfängt einfach endlos eingehende Nachrichten und schreibt alles Empfangene auf STDOUT. Letzteres hast du mit > in eine Datei umgeleitet. Gehen 3 Nachrichten ein, stehen in der Datei halt genau diese 3 Nachrichten.


    <Wild_geraten>

    Was du möchtest ist vermutlich ein Aufruf von mosquitto_sub mit dem Parameter "-C". Schau dir dazu mal den entsprechenden Abschnitt unter "man mosquitto_sub" an.

    </Wild_geraten>

  • Aber wo werden die Nachrichten gespeichert, ich kann nirgends den Topic auf der Platte finden !?

    MQTT speichert eigentlich keine Nachrichten im Sinne der Persistenz wie z.B. eine DB. Siehe dazu z.B. hier. Es gibt aber das retain Flag beim publish mit dem man erreicht dass die letzte Nachricht vorgehalten wird. Dann bekommt jeder neue Client der das Topic subscribed das letzte published Datum. Wird kein retain Flag genutzt muss ein neuer Client warten bis ein neues Datum gesendet wird.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Es geht darum, dass die Dateien unnötig immer größer werden.

    und das kannst du ändern! :wallbash:

    woran klemmts also? :conf:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ok, ich hab jetzt mal auf persistence false gestellt, ändert aber nichts daran.

    Ich verstehe nicht was Du eigentlich erreichen willst :conf: oder liege ich richtig dass Du in einer Datei die letzten n Sensorwerte eines Sensors ablegen willst? Warum willst Du das machen? Eigentlich verarbeiten die MQTT Clients die Daten. D.h. Dein Client sollte dieses Caching der letzten n Sensorwerte machen. Vielleicht gibt es ja eine andere Loesung fuer Dein Problem. was Du zu loesen versuchst ;)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Ich verstehe nicht was Du eigentlich erreichen willst :conf: oder liege ich richtig dass Du in einer Datei die letzten n Sensorwerte eines Sensors ablegen willst? Warum willst Du das machen? Eigentlich verarbeiten die MQTT Clients die Daten. D.h. Dein Client sollte dieses Caching der letzten n Sensorwerte machen. Vielleicht gibt es ja eine andere Loesung fuer Dein Problem. was Du zu loesen versuchst ;)

    Ich wollte MQTT mal ausprobieren, nachdem alle so davon schwärmen, also dachte ich mir, ich probiere das mal mal mit Sensorwerten. Raspberry 1 mit Sensor schickt die Daten an Raspberry 2 und legt den Wert in eine Datei.

    Eigentlich ganz einfach, dachte ich. :daumendreh2:

  • Die Option -C ist doof, weil dann beendet er sich gleich wieder, ohne überhaupt etwas zu empfangen.

    Du musst die man page auch komplett lesen:

    Code
    -C
    Disconnect and exit the program immediately after the given count of messages have been received. This may be useful in
    shell scripts where on a single status value is required, for example.
    
    
    **** Combine with -R to print only the first set of fresh messages **** (i.e. that does not have the retained flag set), or with
    -T to filter which topics are processed.

    Abgesehen davon glaube ich mittlerweile: "You're holding it wrong" :)


    Spaß beiseite: MQTT ist in erster Linie keine Datenbank, die Werte hält, sondern ein Netzwerkprotokoll. Der einzige, der einen Status ähnlich einer Datenbank hält, ist der Broker/Server (hier aber auch maximal die letzte (retained) Message pro Topic. mosquitto_sub ist ein Client, der sich auf ausgewählte Topics registriert und dann die Werte des Brokers/Servers erhält, sobald diese ein Update erfahren. Einen alten Status (alt im Sinne von "Wert wurde übermittelt bevor der mosquitto_sub-Client sich verbunden hat") bekommst du nur für Nachrichten, die als "retain" übermittelt wurden.

    Wenn du die Daten dauerhaft speichern möchtest, ist's sinnvoll(er) sie bspw. in eine influxdb zu pumpen und dann ggfs. mit Grafana zu visualisieren.

  • ich probiere das mal mal mit Sensorwerten. Raspberry 1 mit Sensor schickt die Daten an Raspberry 2 und legt den Wert in eine Datei.

    Ok. D.h. es geht eigentlich nicht um Persistenz sondern Du willst einfach mal einen MQTT Client haben der die Daten liest. In Deinem Beispiel sie dann in eine Datei schreibt. Ein realistischeres Beispiele waere dass der Client auf die Daten lauscht und wenn ein Wert ueber- oder unterschritten wurde irgendwas tut.

    Bash
    #!/bin/bash
    mosquitto_sub -h $mqttBrokerIP -t "/livingRoom/temperature" | \
    while read msg; do
        if (( $msg > 25 )); then
            echo "It's too hot"
        elif (( $msg < 15 )); then
            echo "It's too cold"
        fi
    done

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Dein Beispiel scheint mit den Kommastellen nicht klarzukommen.

    Code
    Zeile 4: ((: 21.91 > 25 : Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".91 > 25 \").
    Zeile 6: ((: 21.91 < 15 : Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".91 < 15 \").

    Als Workaround habe ich jetzt folgendes, das wird mittels crontab -e jede Minute aufgerufen:

    mosquitto_sub -R -C 1 -t topic -u benutzer -P geheim > /pfad/zur/nachricht.txt

    Das scheint zu klappen.

    Nachteil schon gefunden. Wenn das ausgeführt wird, wird erst mal die Datei geleert, bis der Topic ankommt.

  • sag mal stimmt deine Handynummer noch? :conf:

    am Ende 219 :?:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)