Temperaur Dashboard aus Technoline LaCrosse 868 MHz Sensorwerten

  • Hallo zusammen,

    nachdem ich dank euch eine Menge andere Themen und Probleme lösen konnte, bin ich jetzt endlich wieder an der Stelle angekommen, wo ich sein wollte: Der Erstellung eines Grafana-Dashboards mit Temperatur- und Luftfeuchtigkeitswerten meiner Wohnung. (Wenn Grafana keine gute Idee ist, nehme ich auch gern Tipps zu Alternativen entgegen,)

    Nachdem ich feststellen musste, dass mein TFA/Dostmann 868 MHz Sensor entweder vom JeeLink 868 MHz USB-Stick oder von der Bibliothek pyLacrosse doch nicht unterstützt wird, habe ich mir jetzt eine Hand voll Technoline TX29DHT-IT Sensoren gekauft. Damit bekomme ich mittels pyLacrosse plausible Werte angezeigt. Das sieht dann (beispielhaft für 2 Sensoren) so aus:

    Code
    pi@raspberrypi:~ $ pylacrosse -d /dev/ttyUSB0 scan
    id=57 t=21.200000 h=51 nbat=1 name=MeinSensor01
    id=52 t=21.100000 h=51 nbat=1 name=MeinSensor02
    id=57 t=21.200000 h=51 nbat=1 name=MeinSensor01
    id=52 t=21.100000 h=51 nbat=1 name=MeinSensor02
    id=57 t=21.200000 h=51 nbat=1 name=MeinSensor01
    id=52 t=21.100000 h=51 nbat=1 name=MeinSensor02
    id=57 t=21.200000 h=51 nbat=1 name=MeinSensor01

    Die „id“ ist dabei die ID, auf der der Sensor seine Daten sendet. Diese wird leider bei jedem Batteriewechsel neu vergeben. Der „name“ ist eine von mir vergebene Bezeichnung eines Sensors, welche in einem INI-File der ID zugeordnet ist.

    Code
    ~/.lacrosse/known_devices.ini
    
    [0]
    name = Example
    [57]
    name = MeinSensor01
    [52]
    name = MeinSensor02

    Hinweis: Man muss diese Datei known_devices.ini mittels sudo als Root-User erstellen, sonst erkennt pyLacrosse diese nicht.

    Die nächsten Schritte wären nun:

    • Auswählen einer geeigneten (Datenbank-)Methode, die Werte abzuspeichern, sodass sie Grafana auswerten kann.
    • Erstellen eines Skripts oder Service (z.B. systemd Service), der die Werte automatisch ab Start des Raspberry Pi wegschreibt.
    • Installieren und Einrichten von Grafana und Erstellen eines geeigneten Dashboards.

    Als Grafik dargestellt, würde das ganze Konstrukt m.M.n. so aussehen:

    Ich dachte mir, hier im Forum gibt es sicher einige Leute, die mir dazu hilfreiche Tipps geben können, damit ich nicht jedes Anfänger-Fettnäpfchen mitnehme.

    Ich sage schon einmal danke für viele gute Tipps im Voraus.

    Grüße,

    Mic.

    Edited once, last by Mic2022 (October 7, 2023 at 11:58 AM).

  • Temperaur Dashboard aus Technoline LaCrosse 868 MHz Sensorwerten? Schau mal ob du hier fündig wirst!

  • Moin Mic2022,

    so ganz blicke ich nicht durch.

    Wie empfängst du die 868MHz-Signale am Raspberry?

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Edited 2 times, last by Bernd666: Aus (&( 868 gemacht (October 8, 2023 at 11:02 PM).

  • Wie empfängst du die (&(MHz-Signale am Raspberry?

    Per Gateway. Habe mir damals selber ein PCB gezeichnet (das blaue) um damit die Technoline Temperatur Sensoren zu empfangen und dann per serieller Schnittstelle weiterzugehen an den Raspberry Pi. Mittlerweile benutze ich die schwarze Platine (FHEM Lacrosse Gateway v1.5 für FHEM)

    Auf dem Raspberry Pi läuft FHEM. FHEM speichert jeden Datensatz auf einem MySQL Server auf den eine Grafana Instanz zugreifen kann und das ganze visualisiert.

    Mic2022 wenn du eine der beiden Platinen haben möchtest, sag Bescheid. Habe noch ein paar hier unbestückt liegen.

    Thema Datenbank: Nimm besser InfluxDB.

    Grafana: gibt meiner Meinung nach nichts Besseres zum visualisieren

    Images

    Well in my humble opinion, of course without offending anyone who thinks differently from my point of view, but also by looking into this matter in a different way and without fighting and by trying to make it clear and by considering each and every one's opinion, I honestly believe that I completely forgot what I was going to say.

  • Wie empfängst du die (&(MHz-Signale am Raspberry?

    Hallo Bernd666 ,

    danke für deine Rückmeldung. Ich habe es mir einfacher gemacht als ps915 und mir einfach den JeeLink 868 MHz USB-Stick gekauft. Er hat eine Antenne (der rote Draht in meinem Ablaufbild in #1) und empfängt die Signale. Die Python-Bibliothek pyLacrosse ist auf diesen USB-Stick angepasst. Evtl. überlege ich noch später den USB-Stick durch das Empfangsmodul ELV HM-MOD-RPI-PCB aber das steht momentan nicht zur Debatte, weil das wohl nicht so ganz einfach ist und der USB-Stick momentan gut funktioniert.

    Danke und Grüße,
    Mic.

  • Hallo zusammen,

    da ich im Netz bisher keine allgemeine Möglichkeit gefunden, wie man die durch pyLacrosse eingelesenen Sensordaten weiterverwenden kann, gefunden habe, habe ich mir die Python-Dateien von pyLacrosse etwas näher angesehen.

    Wenn man das Skript mittels pylacrosse -d /dev/ttyUSB0 scan in der Kommandozeile ausführt, plottet es die empfangenen Sensordaten Zeile für Zeile als Ausgabe. Wie das aussieht, hatte ich in #1 beschrieben. Wie aber macht es das? Die auf dem RasPi installierte Datei pylacrosse.py enthält dazu nichts.

    Daher habe ich mir das Installationspaket heruntergeladen. Man kann sich damit durch den Befehl python3 setup.py build die Dateien des Tools bauen lassen. Dabei entsteht eine Datei lacrosse.py. In dieser Datei finde ich Code-Zeilen, die für die o.g. Ausgabe bestimmt sind (siehe folgender Code-Auszug dieser Datei). Leider kann ich diese Datei nach der Installation von pyLacrosse mittels python3 setup.py install nirgends finden.

    Auszug aus lacrosse.py:

    Code
    […]
        def __repr__(self):
            return "id=%d t=%f h=%d nbat=%d" % \
                (self.sensorid, self.temperature, self.humidity, self.new_battery)
    […]

    Nun also meine Anfängerfrage: Wie und wo finde ich diese Datei auf meinem RasPi, die bei Ausführung des Befehls pylacrosse -d /dev/ttyUSB0 scan genutzt wird?

    Meine Idee ist, dass ich dieses Skript vielleicht um eine Funktion erweitern kann, die die Messwerte nicht einfach ausgibt, sondern in eine (Datenbank-)Datei schreibt.

    Danke und Grüße,

    Mic.

  • Was kommt bei which pylacrosse im Terminal]?

    Da kommt Folgendes:

    Code
    pi@raspberrypi:~ $ which pylacrosse
    /usr/local/bin/pylacrosse

    Dort war ich aber schon. Das ist "nur" folgendes Skript:

  • Hallo zusammen,

    ich hatte mich mit dem Autor der Python-Bibliothek pyLacrosse in Verbindung gesetzt. Er sagte mir, dass diese Bibliothek nur als Plug-In für Home Assist entwickelt wurde. Sie bietet also nativ keinen Output der Sensorwerte... also muss ich selbst tüfteln.

    Ich bin jetzt soweit voran gekommen, dass ich im Python-Skript cli_tool.py angekommen bin. Dieses ruft lacrosse.py auf. Darin gibt es den Funktionsaufruf scan:

    Code
    def scan(lacrosse, config, args):
        lacrosse.register_all(scan_callback, user_data=config)
        lacrosse.start_scan()
        while True:
            time.sleep(1)

    Leider kann ich an diesem Code nicht erkennen, wie die Funktion die Werte aus lacrosse.py übernimmt und zurück an pylacrosse zur Anzeige übergibt, Was ich aber etwas stümperhaft hinbekommen habe, dass er mir eine Text-Datei erstellt und Zeilen mit Beispieltext darin einträgt. Dieser sollte durch die Sensorwerte ersetzt werden.

    Code
    def scan(lacrosse, config, args):
        lacrosse.register_all(scan_callback, user_data=config)
        lacrosse.start_scan()
        while True:
            time.sleep(1)
            # Mein zusätzlicher Code:
            datei = open("sensordaten.txt","a")
            datei.write("test\n")
            datei.close()

    Zwei Probleme:

    - Er scheibt viel mehr Zeile in die Datei als er Sensordaten auf der Konsole ausgibt.

    - Ich weiß noch nicht, wie ich statt dem "test" hier Sensordaten abspeichern kann.

    Möglicherweise ist das auch die falsche Stelle, wo man ansetzen sollte. Jetzt hoffe ich auf die Python-Experten unter euch. Wie bekomme ich die Sensordaten aus eine Scan Zeile für Zeile in eine Textdatei geschrieben?

    Hier nochmal der Link zum Repo: https://github.com/hthiery/python…ster/pylacrosse

    Vielen Dank und Grüße,

    Mic.

  • Hallo Tell,

    das war tatsächlich der perfekte Hinweis für Schritt eins. Vielen, vielen Dank dafür. Ich habe diese Funktion wie folgt erweitert und bekomme nun die Print-Ausgabe in eine Text-Datei umgeleitet.

    Code
    def scan_callback(sensor, config):
        name = get_known_sensor_name(sensor.sensorid, config)
        print('%s name=%s' % (sensor, name))
        # Neu von mir:
        datei = open("sensordaten.txt","a")
        datei.write(time.strftime('%d.%m.%Y %H:%M:%S') + ' ' + '%s name=%s' % (sensor, name) + '\n')
        datei.close()

    So sieht das dann bildlich aus:

    Nachteil ist noch, dass die Ausgabe, wie sie in lacrosse.py aufgebaut ist, als %s in die Text-Datei geschrieben wird. Um sie in eine Datenbank-Datei schreiben zu können, bräuchte ich aber die einzelnen Werte aber einzeln: Temperarur, Luftfeuchte, Batteriezustand, Sensorname.

    Außerdem fände ich es gut, wenn man zwei unterschiedliche Funktionen (für Ausgabe auf Bildschirm und für Ausgabe in TXT-Datei) hätte, die man mit einem anderen Befehl aufrufen kann, z.B.: pylacrosse -d /dev/ttyUSB0 scan für Konsoenausgabe und pylacrosse -d /dev/ttyUSB0 save

    Danke und Grüße,

    Mic.

  • Post by Mic2022 (October 15, 2023 at 8:38 PM).

    The post was deleted, no further information is available.
  • Hallo,

    soo... ich habe mir jetzt eine neue Funktion [tt[scandb[/tt] in cli_tool.py definiert, in die ich alles reihpacke, was das "Schreiben der Daten in eine Datei" betrifft.

    Ergänzt habe ich dafür in cli_tool.py wiefolgt:

    Weiterhin habe ich auch gemerkt, dass man die Variablen aus lacross.py auch direkt in cli_tool.py anzapfen kann, z.B. mittels sensor.temperature allerdings stürzt das Skript ab, wenn ich mir damit einen Text-String erstellen möchten, den ich dann beispielhaft in eine Text-Datei schreibe:

    Code
    datei.write(time.strftime('%d.%m.%Y %H:%M:%S') + ' id= ' + sensor.sensorid + ' t=' + sensor.temperature + ' h=' + sensor.humidity + ' nbat=' + sensor.new_battery + ' name=%s' % (name) + '\n')

    Wandle ich dann die Werte in einen string um, sieht der Output in die Textdatei nicht mehr so aus, wie er sein sollte:

    Code
    datei.write(time.strftime('%d.%m.%Y %H:%M:%S') + ' id= ' + str(sensor.sensorid) + ' t=' + str(sensor.temperature) + ' h=' + str(sensor.humidity) + ' nbat=' + str(sensor.new_battery) + ' name=%s' % (name) + '\n')

    Damit wird aus einer Textausgabe

    15.10.2023 20:25:15 id=34 t=19.600000 h=45 nbat=0 name=MeinSensor01 (wie es sein soll),

    eine Textausgabe

    15.10.2023 20:33:17 id=34 t=19.7 h=45 nbat=False name=MeinSensor01 (wie es nicht sein soll).

    Wie müsste ich es richtig formatieren, damit ich aus den Einzel-Variablen wieder die ursprüngliche Zeile "zusammenstückeln kann?

    Vielen Dank und Grüße,
    Mic.

  • Guten Abend,

    wieder einen Schritt weiter. Ich habe jetzt meine Funktion wie folgt erweitert. Damit kann ich nun die einzelnen Sensordaten (Sensor-ID, Temperatur, Luftfeuchte, Batteriestatus) einzeln abgreifen. Dummerweise wird damit der Batteriestatus immer noch als True statt als 1 dargestellt. Das habe ich mit einer kleinen Code-Zeile umformatiert.

    Der neue Code:

    Code
        sid_tmp = '%s' % (sensor.sensorid)
        temp_tmp = '%s' % (sensor.temperature)
        hum_tmp = '%s' % (sensor.humidity)
        nb_tmp = '%s' % (sensor.new_battery)
        nb_tmp = 1 if nb_tmp else 0
    
        datei = open(db_file,"a")
        datei.write(time.strftime('%d.%m.%Y %H:%M:%S') + ' id=' + sid_tmp + ' t=' + temp_tmp + ' h=' + hum_tmp + ' nbat=' + str(nb_tmp) + ' name=%s' % (name) + '\n')
        datei.close()

    Damit bekomme ich nun folgenden Output in der Text-Datei:

    16.10.2023 20:57:38 id=56 t=19.9 h=45 nbat=1 name=MeinSensor01

    Die vielen Nachkommastellen wie beim originalen Output in der Kommandozeile sind zwar weg aber die haben eh keinen Wert. Ich denke, damit kann ich nun arbeiten und mir überlegen, wie ich die Daten so abspeichere, dass sie von Grafana verarbeitet werden können. Ich denke, ich versuche mich an einer Datenbanklösung.

    Danke und Grüße,

    Mic.

  • Als Anregung:

    Python
    with open(db_file, "a") as datei:
        datei.write(f"{time.strftime('%d.%m.%Y %H:%M:%S')} "
                    f"id={sensor.sensorid} "
                    f"t={sensor.temperature} h={sensor.humidity} "
                    f"nbat={1 if sensor.new_battery else 0} "
                    f"name={name}\n")

    (Etwas gekürzt durch Einsatz von with und f-strings, ungetestet!)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!