Funkempfänger für 433Mhz

  • Hier wird der Eintrag immer "nur" aktualisiert, wenn sich mind. einer der Werte geändert hat (und der Sender sendet). Es wird auch nur ein Eintrag angezeigt, keine Chronik.

    Im Terminalfenster jedoch wird chronologisch jeder gesendeter Wert angezeigt. Daher meine Idee diese auszulesen. Wird das iwo zwischengespeicher?

    Diese (alle) Werte werden auch unter /tmp/f007.log (diese Datei habe ich bei der "Installation" angelegt) eingetragen. Weiterhin sind dort auch der Start (und Stop) des Programmes und die requests (datum uhrzeit GET "/api/sensors") an den http-server (?) dokumentiert. Alles chronologisch. Vllt lässt es sich ja auch daraus auslesen, jedoch weis ich nicht wie, und mache mir Gedanken über die Größe der Datei (im Betrieb wird die ja immer weiter "zugespamt". 9.1. 18.30uhr bis 11.1. 15.30uhr sinds 264kB Speicher)

  • Naja, dein Endpunkt nimmt nur einen Wert für die Temperatur an und wird intern dann wohl den aktuellen Zeitstempel nehmen, wann dieser Temperaturwert empfangen wurde. Alles chronologisch zu sammeln wird dir also nichts bringen, wenn du nicht die jeweiligen Zeiten mit übertragen kannst.

    Entweder der Endpunkt wird doch noch geändert, sodass er optional auch den Zeitstempel bekommt oder du sendest doch eben immer nur den aktuellsten Wert, sobald dieser vorhanden ist. Die Zeit wird dann auch nicht exakt sein, aber es ist besser als x Werte gleichzeitig zu senden, die dann alle den gleichen Zeitstempel bekommen.


    Was ist denn eigentlich dieser Endpunkt? Ist das eine Datenbank (InfluxDB) und danach werden die Werte visualisiert (Grafana?)?

    Kelvin

  • Das hast du wohl falsch verstanden (oder ich missverständlich erklärt).

    Ich möchte schon immer nur den aktuellen Wert (bzw. einen Wert für Temperatur und einen für Feuchtigkeit) übertragen. Diese log-File musste ich für das Tool (/dessen "Installation") erstellen.

    Ziel ist es ca im 10 min Takt den derzeit aktuellsten Wert (Sensor sendet alle 1min 13s) an die URLs (eine für Temperatur, eine für Feuchtigkeit) zu senden. Dies wird am besten mittels eines Py-Scrips funktionieren, nehme ich an. Jedoch weiß ich nicht von wo ich die Werte auslese(n kann). Ich dachte dies ist ggf. vom Terminal (bzw. dessen Zwischenspeicher/den temporären (?) Messwert-Speicherplatz der für die Anzeige der Werte im Terminal nötig ist) möglich. Die Terminalanzeige wird die Werte ja vmtl. von einer Art Zwischenspeicher auslesen um diese anzuzeigen.


    Also zusammengefasst: aktuelle Messwerte müssen irgendwo (zwischengespeichert) sein. Diese möchte ich mit einem Pythonscript auslesen und in diesem dann weiterverarbeiten (ggf. in °C umwandeln und ins passende Format bringen) und anschließend an die URLs senden.


    Genaue Infos kann ich dir über den Endpunkt nicht geben, weil ich das nicht weiß. Er wurde von der Partnerfirma, mit der ich das Projekt durchführe erstellt. Die Daten werden auf jeden Fall auf der Website einerseits aufgelistet und andererseits auch visuell Dargestellt. Wie das genau von statten geht, keine Ahnung.

  • okay, da muss ich mich mal einlesen wie das funktioniert (und was das überhaupt ist :D), danke.


    Ah cool, rtl_433 habe ich parallel auch laufen, allerdings mit einem DVB-T Stick. Weiterhin wollte ich das gerne mit dem anderen Programm (um das es gerade geht) testen und auch mit einem RXB6-Modul, was ja bedeutend billiger ist als so ein Stick. Muss ich mir mal genauer anschauen den Link.


    Ich hab unten mal ein Bild vom Output in der Konsole eingefügt. Das sollte denk passen. In dem von mir beschriebenen log-File sieht das übrigens genau so aus. Weiterhin noch Bilder vom http-Server und dessen Ausgabe(formaten). Hoffe das hilft weiter.

  • Okay, mache ich später. Vllt. ne dumme Frage, aber warum reicht das nicht als Bild? Soll ich dann einfach den Code aus dem Terminal herauskopieren?


    Ich möchte einerseits den Wert der Temperatur und andererseits den Wert der Feuchtigkeit. Also die reinen Zahlenwerte. Die sollen dann separat im JSON-Format an je eine URL gesendet werden. Siehe auch meine vorherigen Erklärungen hier drüber.


    ok, das probiere ich mal aus.

  • > warum reicht das nicht als Bild?

    Weil:

    • man das besser lesen kann
    • ich keine Lust habe Text aus Bildern abzutippen (gilt vermutlich auch fuer viele andere in diesem Forum)


    Mach noch folgenden Versuch:

    Code
    <dein Befehl aus dem Bild> | grep temperature

    Wenn alle paar Minuten die Temperatur ausgegeben wird ist der Versuch gelungen.


    Wenn sehr lange nichts kommt und dann eine Menge Zeilen auf einmal ist der Versuch nicht gelungen. Dann hast du ein Problem mit dem Buffering.

  • Verstehe. Also, hier der Code in Textform:

    Code: Sendebsp.
    2022-01-12 16:56:06+0100
    type              = Ambient Weather F007TH
    channel           = 7
    rolling code      = 0x00d4(212)
    temperature       = 15.4C
    humidity          = 51%
    battery           = OK

    und hier das ganze mit dem vorgeschlagenen Befehl. Sieht ja ganz gut aus.

    Code: bsp. mit grep
    Enabled protocols:00592TXR,TX7U,WH2,HG02832,F007TH,TFA303049
    Log file is "/tmp/f007.log".
    Receiving data...
      temperature       = 15.4C

    Nun jedoch die grundlegende Frage, wie lese ich diesen Wert mit einem Skrip aus. Dieses Skript wird ja für die JSON-"Verpackung" und Versendung notwendig sein, richtig?

  • Alles auf einer Zeile!

    Code
    <dein befehl> | awk '$1 == "temperature" { temperature = $3 } $1 == "humidity" { printf("{ \"value\": %f, \"hum\": %f }\0",temperature,$3) }' | xargs -0 -l1 curl -X POST http://192.168.1.200  -H 'Content-Type: application/json' -d 
  • okay, überfordert mich jetzt erst einmal der Befehl (um das nachzvollziehen zu können) :D

    Anstatt "http://192.168.1.200" dann meine Zielurl? Weiterhin habe ich eine URL für die Temperatur und eine für für die Feuchtigkeit. Bei dir geht das an einen Endpunkt oder? Wenn dem so ist lässt sich das ja sicher der Befehl "auseinanderziehen"

  • Mit zwei Endpoints, mit bash und curl:

    Code
    <dein befehl> | while read key op val; do case $key in    temperature) curl -X POST http://192.168.1.200/temp  -H 'Content-Type: application/json' -d "{ \"value\": ${val/C/} }" ;;    humidity) curl -X POST http://192.168.1.200/hum  -H 'Content-Type: application/json' -d "{ \"value\": ${val/\%/} }" ;; esac; done

    Ja, man kann das auch besser formatieren (die ;; gehoeren zur vorangehenden Zeile):

    Code
    <dein befehl> | while read key op val
    do
     case $key in
        temperature) curl -X POST http://192.168.1.200/temp -H 'Content-Type: application/json' -d "{ \"value\": ${val/C/} }"  ;;    humidity) curl -X POST http://192.168.1.200/hum  -H 'Content-Type: application/json' -d "{ \"value\": ${val/\%/} }" ;; esac;
    done

    Den curl-Aufruf in eine Funktion zu verpacken waere keine schlechte Idee :)

  • Wow, vielen Dank für deine Mühe!

    Aktuell verstehe ich aber noch nicht ganz was wo wie abgeht. Kann mir die einzelnen Funktionen der Befehle in etwa herleiten, aber nicht im Detail was wofür gut ist. Falls du also ne gute Quelle mit sachdienlichen Infos hättest, wäre super praktisch.


    Weiterhin ist mir aufgefallen, dass im nächsten Schritt mehrere Sensoren eingesetzt werden sollen. Die Unterscheidung erfolgt ja dann mittels ID/rolling code (der sich bei jedem Batteriewechsel ändert, habe ich gelesen). Ergo muss noch ein Abgleich der ID eingebaut werden, sodass auch an den richtigen Endpunkt gesendet wird.

    Aufgrund der Code-Menge mach dann die Auslagerung in ein Skrip Sinn, glaube ich. Funktioniert das dann einfach wie im Terminal mit den Befehlen? (Vllt. ne ziemlich dämliche Frage)

  • Ergo muss noch ein Abgleich der ID eingebaut werden, sodass auch an den richtigen Endpunkt gesendet wird.

    Haben die anderen Endpunkte ganz andere IP-Adressen, weil das unterschiedliche Server sind? Oder geht das trotzdem noch an denselben Server, aber die URL ändert sich hinten etwas? (z.B. <IP>/api/sensor/0/, <IP>/api/sensor/1/, <IP>/api/sensor/2/, ...)

    Kelvin

  • Ich hasse es wenn die Requirements nach dem Coden geaendert werden! Deshalb ist dies mein letzter Beitrag in diesem Thread.


    Aufruf:

    Code
    <dein Befehl> | ./send.sh