Wemos D1 Mini, Paho MQTT, Datenbank, Daten in Variable

  • Um bei deinem Beispiel zu blieben:




    Gibt es bei Temperatur einen Fehler:

    Code
    python3 test2.py 
    Connected with result code 0
    Caught exception in on_message: name 'Temperatur' is not defined


    Wir schauen nach:

    Code
    Temperatur == float(msg.payload.decode())

    Das ist ja ein Vergleich mit der Veriablen "Temperatur" => Nur ein Gleichheitszeichen


    Und schon gehts.

  • Danke für die Hilfen!


    Ich habe es jetzt (fast) so umgesetzt, wie WPi2 beschrieben hat.



    Ich bin mit dem "global" leider nicht wirklich zufrieden, aber ich kann mir momentan nicht anders helfen.

    Warum ich das gemacht habe?

    Wenn jetzt noch mehrere Sensoren dazukommen, dann gibt es ja mehrere Topic's. Zum Beispiel

    - ESP/Garage

    - ESP/Wohnzimmer

    - ESP/Kueche


    Meinen Aufbau innerhalb Influx stelle ich mir so vor:

    Zeitstempel           Temperatur        Feuchtigkeit          Spannung           Aufstellort

    So habe ich nur eine Tabelle und kann über den Aufstellort differenzieren, welchen Sensor ich sehen will.

    Dass ich das mit dem Aufstellort schaffe, würde ich einen "Tag" hinzufügen welcher drin stehen hat, welcher Sensor das ist.


    Ich weiß es ist nicht sauber...

  • Jetzt hast du genau den Fehler gemacht, den ich beschrieben haben. Anstatt wie vorgeschlagen jeden Wert dann zu sichern, wenn er ankommt, bindest du das sichern an EINEN von den drei Werten. Und ignorierst dabei, dass es in MQTT keinerlei Garantie dafür gibt, das eine Nachricht durchkommt (so wie du es nutzt). Womit du nicht sicherstellen kannst, dass du nicht mehrfach den gleichen Wert für Temperatur oder Spannung bekommst, weil deren Nachricht nicht ankam, aber dann kommt die Feuchtigkeit durch und speichert einfach den letzten bekannten Wert ab.


    Es geht hier auch nicht um “sauber”. Es ist schlicht FALSCH. Und hat auch keinen Mehrwert bezüglich deines Szenarios.

  • Anstatt wie vorgeschlagen jeden Wert dann zu sichern, wenn er ankommt, bindest du das sichern an EINEN von den drei Werten.

    Ich frage wirklich sehr ungern, aber kannst du mir mal eine Beispiel zeigen, wie du es machen würdest?

    Leider weiß ich nicht, wie es das anstellen soll.

    Blähe ich mir da meine Datenbank nicht sehr auf, wenn ein Wert ankommt und ich sichere diese sofort, als dass ich warte bis alle 3 Werte da sind und ich dann alle 3 in eine Zeile sichere?

    Im blödsten Fall kommen doch die Werte Zeitversetzt und ich speichere mir 3 Zeilen anstatt eine?

    Da bei mir ja später noch mehrere Sensoren dazu kommen sollen, ist das für mich momentan sehr schwer das irgendwie anders hin zu bekommen.


    Ich verstehe, was du sagen willst, bezüglich dessen, dass vielleicht Nachrichten nicht ankommen.

  • Die Menge an Daten ist exakt gleich viel. Ob einmal drei Sachen speichert, oder dreimal eine - Same same.


    Und du rufst halt insert_bad dreimal statt einmal auf.

  • Muss ich dann trotzdem über die globale Variable gehen, oder kann man das direkt übergeben.

    Soll ich dann pro Eintragung in die Datenbank einen eigenen Insert machen? Oder wie kann ich es lösen, wenn ein Wert nicht ankommt, dass dieser leer gelassen wird?

    Ich denke, wenn ich 3 Werte überbeben will und es kommen nur 2, dass hier ein Fehler kommt.

    Und wenn ich jeden Wert einzel übergebe, dann muss ich ja 3 einzelne Inserts schreiben?

  • Du machst einen insert, dessen Schlüssel eben das topic (oder etwas davon abgeleitetetes) ist, und das war’s. Du musst keine zwei anderen Werte leer lassen, das verfälscht doch nur die Daten.


    Globale Variablen sind dann unnötig.

  • Ich bin da ehrlich gesagt am Ende. Deine Idee war dir Telegraf zu sparen, weil es vermeintlich zu viel Aufwand ist. Zu dem Zeitpunkt war mir unklar, wieviel Python du sprichst. Jetzt ist mir das klar, und ich denke mal, du stimmst mir zu: wenig bis gar nicht.


    Wenn die Zeitersparnis hier dadurch zustande kommt, dass man dir zeilenweise diktieren muss, wie es geht, statt dich nur auf das richtige Gleis zu setzen, dann übersteigt das zumindest meine Bereitschaft und Möglichkeiten. Weder kann ich hier einen Grundkurs Python abliefern, noch deinen Code für dich schreiben. Das fällt einfach nicht unter meine Vorstellung, was ich hier an Hilfe anbieten kann.


    Ich kann’s nur nochmal empfehlen: Telegraf als universeller Adapter erlaubt dir, alle MQTT Nachrichten in InfluxDB zu stopfen, und per Chronograf und Kapacitor kannst du visualisieren und trigger definieren. Siehe https://www.influxdata.com/time-series-platform/telegraf/


    Du kommst damit in jedem Belang deinen Wünschen schneller näher, als auf aus dem netz geklaubte Skripte zu klopfen, bis sie hoffentlich passen.

  • Ich stimme dir voll und ganz zu. Ich spreche wirklich wenig Python.

    Ich habe bisher allerdings mit vielen Anleitung immer das hin bekommen, was ich mir vorgestellt habe. Ob es nun richtig ist oder nicht steht auf einem anderen Blatt, aber ich komme genau zu dem Ergebnis was ich mir erhofft habe.


    Hier stehe ich aber vor einem Problem das ich selber nicht lösen kann.

    Ich möchte von dir oder anderen Leute hier auch kein fertiges Skript haben. Ich hätte nur gehofft, dass du mir vielleicht mit ein paar Zeilen auf die richtige Spur bringst.

    Es muss nicht der komplette Code sein. Nur wie ich wie von dir vorgeschlagen, das hier schaffen könnte:

    Code
    "fields": {
       topic : value
        }

    An dem denke ich scheitert es nämlich momentan am meisten. Da ich nicht weiß, wie ich es in meinem Beispiel, zusammen bauen muss.

  • Chronograf und Kapacitor kannst du visualisieren und trigger definieren

    Chronograf ist also ein "Konkurenz" Produkt zu Grafana. Seh ich das richtig? Nur dass das direkt für Influx ist.

    Kapacitor ist sogesehen in Grafana auch schon integriert

  • Ich denke ja, wobei ich mit Grafana noch nicht wirklich was gemacht habe. Doch so weit ich das aus Beschreibungen kenne - ja.