Volkszähler mit bestehnder sql Datenbank füttern?

  • Hey Leute,


    ich werde im nächsten Jahr ein Haus bauen (unter anderem mit photovoltaik anlage) und ich möchte dabei dann eine Haussteuerung machen. Das ganze wird dann mit einigen Arduinos (als Datenlogger) und einem Server mit openhab passieren. Weiters sollte aber noch zusätzlich ein Volkszähler arbeiten, der mir dann bestimmte Daten visualisiert. Dabei geht es dann um Temperaturen, Sonneneinstrahlung, Leistung der PV Anlage usw.


    Ich habe über den letzten Sommer einen Datenlogger für meine Poolpumpensteuerung gebaut. Dieser schaltet die Poolpumpe nach diversen Kriterien ein und aus. Dabei werden 3 Temperaturen (Pooltemperatur, Solartemperatur und Aussentemperatur) und ein Pumpenstatus (sind Zahlen, die mir den Status wie AutoEin / AutoAus/ Hystere / HandEin / HandAus anzeigen) geloggt. Diese Daten wurden über den Arduino und ein ESP8266 WLAN Modul an einen Webhoster geschickt. Dieser hat dann mithilfe php die Daten in eine MYSQL Datenbank geschrieben.
    Ich habe dann die daten mit "highcharts" visualisiert, was zwar funktioniert, jedoch ist das Handling ziemlich umständlich.


    Dadurch bin ich dann zum Volkszähler gekommen, da mir die Darstellung der Daten sehr gefällt.


    Ich habe dann einmal eine Virtuelle Maschiene erstellt und die middleware in ubuntu installiert. Ich weiß aber nicht, wie ich nun weiter vorgehen soll?


    Also Ausgangslage:
    MYSQL Datenbank an einem Webhoster vorhanden, die auch gefüttert wird.


    Was will ich erreichen:
    Zuerst soll der Volkszähler im Webhoster mit der bestehenden MYSQL Datenbank funktionieren. Alles am Webhoster. Ich denke, ich muss eine neue Tabelle anlegen, die mir die Daten richtig aufbereitet? nur wie?
    Dass ich verschiedene Tabellen mit data, entries usw. brauche ist mir klar, aber wie genau?


    Was ich danach noch erreichen möchte:
    Aggregation. Wie es funktioniert ist mir klar, aber wie ich die zusätzlichen Tabellen einmal erstelle ist mir noch nicht ganz klar. Die automatische Aktualisierung ist im Wiki zumindest beschrieben.


    Ich hoffe, ihr könnt mir weiterhelfen, würde mich sehr freuen.


    Im Anhang ein Auszug der Datenbank. Jeder einzelne Datensatz beinhaltet also die Daten aller Sensoren

  • In meinen Augen wäre die Einfachste Lösung:

    • passende Kanäle im Volkszähler anlegen
    • die alten Daten mittels php-Script aus der alten Datenbank anfordern
    • Timestamp generieren zu den alten Daten
    • an die VZ-Middleware senden


    Um die Aggregate-Tabelle brauchst du dir da keine Gedanken machen, die werden dann aus den Daten die in der VZ-DB sind generiert.



    Wenn dir die Struktur der VZ-DB in der Tabelle data klar ist kannst du es natürlich auch direkt in Mysql machen.



    mfg JAU

    No Shift - No Service

  • Wie die Grundstruktur der VZ Datenbank unter mysql anzulegen ist, steht haarklein und in korrekter Reihenfolge in einem Dump einer noch VZ DB drinnen. Die Datensätze kann mann dann ja im Dump löschen und diesen dann unter DB Rootrechten
    auf dem neuen System einspielen.


    Und das macht man z.B. so:


    Probieren wir mal eine Datensicherung der mysqldatenbank "volkszaehler" als User vz mit passwort demo:


    sudo -s
    mysqldump -uvz -pdemo volkszaehler | cat > `date +%Y%m%d`_`uname -n`_volkszaehler.sql

  • Hey Leute.


    Danke euch beiden schon einmal für die Antworten.


    Ich habe nun die Middleware am Webhoster am laufen. Habe auch schon die Struktur in der Datenbank angepasst.
    Komischerweise kann ich im frontend die Kanäle nur mit der UUID hinzufügen und nicht über öffentliche Kanäle - > Middleware Local.
    Einen neuen Kanal erstellen geht komischerweise auch nicht. Habe aber gelesen, dass ich das einfach in Ubuntu machen soll/kann.


    Aber wie genau bekomme ich die alten Daten nun in die neue Struktur?


    JAU
    Wie muss denn das php script aussehen? Oder wie kann ich das über mysql machen?


    Vielen Dank noch einmal. Echt toll, dass hier geholfen wird :)


    Sollte ich schon einen Fehler gemacht haben (da ich die Kanäle nicht über die "öffentlichen Kanäle" ) und ihr braucht da noch infos dann bitte Bescheid geben.

  • Zitat von daniel_89

    Einen neuen Kanal erstellen geht komischerweise auch nicht.

    Zitat von daniel_89

    Habe auch schon die Struktur in der Datenbank angepasst.


    Aha. :|


    Zitat von daniel_89

    Komischerweise kann ich im frontend die Kanäle nur mit der UUID hinzufügen und nicht über öffentliche Kanäle - > Middleware Local.


    Völlig normal. Zuerst wird ein Kanal erstellt, die UUID dient zur Identifizierung. Beim erstellen kann man ein Häkchen bei "Cookies" und "öffentliche Kanäle" setzen.
    Das Cookie dient dazu die Kanaäle die du abonniert hast zu speichern. Solltest du den Browsercache mal löschen sind die Cookies natürlich weg und du musst die Kanäle neu abonnieren. Du musst dann entweder die UUID manuell eingeben oder wählst sie aus der Drop-Down-Liste aus wenn du (beim erstellen) den Haken bei öffentlich gesetzt hast.


    Zitat von daniel_89

    Einen neuen Kanal erstellen geht komischerweise auch nicht.


    Geht das bitte etwas detailierter?


    Zitat von daniel_89

    Habe aber gelesen, dass ich das einfach in Ubuntu machen soll/kann.


    Hä?


    Zitat von daniel_89

    Wie muss denn das php script aussehen? Oder wie kann ich das über mysql machen?


    Was du da vorhast ist schon ein Spezialfall, da wirst du dich wohl selbst einarbeiten müssen.
    Grundsätzlich wirst du aber 3 Kanäle für Temperatur anlegen müssen. Dann rufst du die Daten aus der alten DB auf und schickst sie jeweils mit Zeit (ts=) und Wert (value=) an die 3 Kanäle.
    Wie das über die Middlware auszusehen hat ist in der Referenz beschrieben.



    mfg JAU

    No Shift - No Service

  • Zitat von JAU


    Aha. :|



    Völlig normal. Zuerst wird ein Kanal erstellt, die UUID dient zur Identifizierung. Beim erstellen kann man ein Häkchen bei "Cookies" und "öffentliche Kanäle" setzen.
    Das Cookie dient dazu die Kanaäle die du abonniert hast zu speichern. Solltest du den Browsercache mal löschen sind die Cookies natürlich weg und du musst die Kanäle neu abonnieren. Du musst dann entweder die UUID manuell eingeben oder wählst sie aus der Drop-Down-Liste aus wenn du (beim erstellen) den Haken bei öffentlich gesetzt hast.


    Achja, ist klar, hatte den neuen Kanal beim erstellen unter Ubuntu nicht als öffentlich erstellt. Das Feld war bei mir grau und hab daher gar nicht versucht, den hacken zu setzen. Hacken setzen funktioniert jedoch trotzdem. Muss ich am Abend noch einmal testen, ob der neue Kanal dann in der Drop-Down Liste kommt.


    Zitat von JAU

    [


    Geht das bitte etwas detailierter?


    Ja geht detailierter. Sorry, wusste nicht, wie viel Informationen du dazu brauchst.


    Also wenn ich einen neuen Kanal in der Middleware am Webhoster erstelle, flackert der neue Kanal ganz kurz auf und wird dann nicht mehr angezeigt. In der Mysql Datenbank wird auch kein neuer Eintrag erstellt. Habe dann gestern am Abend das Debugging im VZ eingeschaltet.
    Wenn ich nun einen neuen Kanal erstelle, kommt im Debugging Pop Up diese Fehlermeldung:
    Popup-Titel: "400: ContextErrorException"
    Inhalt: "../middleware.php/channel.json?type=temperature&title=test&public=1&color=aqua&style=lines&fillstyle=0&yaxis=auto&operation=add:


    Warning: is_readable() [function.is-readable]: open_basedir restriction in effect. File(/dev/urandom) is not within the allowed path(s): (/users/pool/www:/users/_temp/pool)"


    pool ist mein Name im Webhoster.


    Zitat von JAU


    Hä?


    Ja wahrscheinlich habe ich da wohl etwas durcheinander gebracht? Die Installation der Middleware sollte wohl unter Ubuntu erstellen, da man ja die root Rechte am Server braucht für die Installation. Das geht dann über den Webhoster ja nicht... Habe ich das richtig verstanden?


    Zitat von JAU

    [


    Was du da vorhast ist schon ein Spezialfall, da wirst du dich wohl selbst einarbeiten müssen.
    Grundsätzlich wirst du aber 3 Kanäle für Temperatur anlegen müssen. Dann rufst du die Daten aus der alten DB auf und schickst sie jeweils mit Zeit (ts=) und Wert (value=) an die 3 Kanäle.
    Wie das über die Middlware auszusehen hat ist in der Referenz beschrieben.



    mfg JAU


    Ok, ich denke das wird mein größtes Problem dabei werden. Muss mal schauen, wie ich das hinbekomme. Das größte Problem hierbei ist, dass das Datum in der bestehenden Datenbank anders gespeichert ist und ich das quasi in den "Middleware-Timestamp" umwandeln muss. Ich muss dass ganze dann wohl über php bzw. mysql direkt machen. Der Referenzlink zeigt mir ja, wie ich Daten über die Middleware abrufe, aber dazu müssen die Daten ja schon vorhanden sein

  • Zitat von daniel_89

    Warning: is_readable() [function.is-readable]: open_basedir restriction in effect. File(/dev/urandom) is not within the allowed path(s): (/users/pool/www:/users/_temp/pool)"


    Dein Hoster erlaubt dir keine Zugriffe ausserhalb des Userverzeichnisses. Ich vermute auf /dev/urandom wird zugegriffen um eine UUID erstellen zu können.


    Zitat von daniel_89

    Die Installation der Middleware sollte wohl unter Ubuntu erstellen, da man ja die root Rechte am Server braucht für die Installation. Das geht dann über den Webhoster ja nicht... Habe ich das richtig verstanden?


    Ja. Wobei es egal ist was es für eine Distribution ist, kann z.B. auch Debian statt Ubuntu sein.


    Wichtig ist halt das die Vorausetzungen auf dem Server gegeben sind: Ausreichende Rechte auf der MySQL-Datenbank und die passende php-Version (und wohl noch der eine oder andere Fallstrick).


    Zitat von daniel_89

    Das größte Problem hierbei ist, dass das Datum in der bestehenden Datenbank anders gespeichert ist und ich das quasi in den "Middleware-Timestamp" umwandeln muss. Ich muss dass ganze dann wohl über php bzw. mysql direkt machen.


    Für MySQL stimmt das meines Wissen. Über die Middleware kannst du aber auch php-Datumsformat verwenden.
    Steht auch so in der Referenz.



    mfg JAU

    No Shift - No Service

  • Zitat von JAU


    Dein Hoster erlaubt dir keine Zugriffe ausserhalb des Userverzeichnisses. Ich vermute auf /dev/urandom wird zugegriffen um eine UUID erstellen zu können.


    Okay, das habe ich mir schon gedacht. Na gut, dann muss ich die neuen Kanäle halt über die Ubuntu Maschine erstellen. Ist jetzt nicht sooo schlimm


    Zitat von JAU


    Ja. Wobei es egal ist was es für eine Distribution ist, kann z.B. auch Debian statt Ubuntu sein.


    Wichtig ist halt das die Vorausetzungen auf dem Server gegeben sind: Ausreichende Rechte auf der MySQL-Datenbank und die passende php-Version (und wohl noch der eine oder andere Fallstrick)./quote]


    Ja es muss halt ein Linux Betriebssystem sein, klar. Ich habe mich für ubuntu entschieden.


    Okay, also ich habe heute mal die Kanäle neu erstellt unter ubutu und dieses mal öffentlich. Hat dann über das Drop-down Menü super geklappt :):danke:


    So, habe dann mal manuell ein paar Datensätze in die DB geschrieben. Zuerst wollte ich das Datumsforamt direkt übernehem. Musste dann natürlich noch den Datentyp der Struktur ändern auf "Timestamp". Habe dann ein paar Daten eingetragen mit dem Timestamp aus meiner alten Datenbank. Klappte nicht "nothing to plot". Habe dann den Typ wieder umgestellt und dann meinen Timestamp in "mS nach 1970" umgerecht. Natürlich wurde dann im Volkszähler mein Graph angezeigt.
    Muss mich dann mal mit php beschäftigen, wie ich am besten meine Daten in die neue DB transferiere. Das Problem mit dem Timestamp habe ich dann leider noch immer.


    Ich dachte mir, die neuen Daten insbesondere meine Temperaturen könnte ich ja Spalte für Spalte in die neue DB schreiben. Dann sind halt zuerst über 1 Million Datensätze mit der ID "1" für meine Pooltemperatur. Dannach würden dann über 1 Million Datensätze mit der ID "2" kommen usw. Und nicht ID 1, ID 2, ID 3, ID 4, ID 1, ID 2, ID 3 usw. sieht dann halt komisch aus in der DB aber ich denke, es wäre einfacher zu realisieren.