Suche Programmierer. Datenbank auslesen und visualisieren per Highcharts.

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Schau mal genau auf deinen Code - da kommt es zu einer Fehlermeldung, und die erklaert auch genau, warum dann ein Folgefehler auftaucht.

  • Suche Programmierer. Datenbank auslesen und visualisieren per Highcharts.? Schau mal ob du hier fündig wirst!


  • Schau mal genau auf deinen Code - da kommt es zu einer Fehlermeldung, und die erklaert auch genau, warum dann ein Folgefehler auftaucht.

    Hallo deets,

    danke fürs darum kümmern!
    Wie oben geschrieben, hab ich mehrere Versuche gestartet, an verschiedenen Stellen einen Namen bzw. mein localhost einzutragen.
    Sorry, ich komm nicht auf den Trichter warum die config.php nicht gelesen werden kann. :helpnew: Muss auch dazusagen ich hab wenig Ahnung vom scripten, bau halt nach oder um, um ein bisschen zu lernen.

    Beste Grüße
    Karsten

    Einmal editiert, zuletzt von ilovepis (28. Dezember 2016 um 15:38)

  • Die config.php wird auch bei dir gelesen, nur wird keine Zeile mit " dbhost " gefunden bzw "mysqlHost" gesetzt.
    Eigentlich sollte das ab Zeile 54 geregelt werden:
    [code=php]
    if php_config['dbhost']:
    mysqlHost = php_config['dbhost']
    else:
    mysqlHost = "127.0.0.1"
    [/php]...aber da hab ich wohl Mist gebaut :blush:

    Änder das dht.py Script ab Zeile 54 wie folgt ab:

    [code=php]
    if 'dbhost' in php_config:
    mysqlHost = php_config['dbhost']
    else:
    mysqlHost = "127.0.0.1"
    if 'dbport' in php_config:
    mysqlPort = php_config['dbport']
    else:
    mysqlPort = 3306
    [/php](einrückung der ersten zeile hier verhunzt leider das forum. entsprechend anpassen!)

    Vollständig sähe das Script dann so aus:
    [code=php]
    #!/usr/bin/python3
    # coding: utf-8
    #
    # Read DHT Sensors and write into MySQL Database for HighCharts
    # 28.12.2016 Copyright (C) by meigrafd (meiraspi@gmail.com) published under the MIT License
    #
    # NOTE:
    # Im using CyMySQL which is a fork of pymysql with speedups. See http://stackoverflow.com/a/25724855
    #
    #------------------------------------------------------------------------
    import sys
    import time
    import os
    import re
    #from decimal import Decimal, ROUND_HALF_UP
    sensor_dict={}
    #------------------------------------------------------------------------
    #
    #### CONFIG - START

    # Specify Path to config.php File
    phpConfigFile = '/var/www/html/charts/include/config.php'

    # DHT Sensor Type, GPIO pin and Place.
    # Format: sensor_dict["<Place>"] = "<Type>;<GPIO>"
    # E.g.: sensor_dict["Bath"] = "22;4"
    # Types: 11 = DHT11 , 22 = DHT22 , 23 = AM2302
    sensor_dict["Badezimmer"] = "22;4"
    sensor_dict["Terrasse"] = "22;17"

    #### CONFIG - END
    #
    #------------------------------------------------------------------------
    try:
    import cymysql
    except ImportError:
    print("ERROR: You must install cymysql Module: sudo apt-get install python3-pip && sudo pip-3.2 install cymysql")
    exit()
    try:
    import Adafruit_DHT
    except ImportError:
    print("ERROR: You must install Adafruit_DHT Python3 Module!")
    exit()


    # Try to read config.php to get mysql settings
    # http://stackoverflow.com/questions/1688…m-python-script
    try:
    pattern = re.compile(r"""(^)\$([a-z]*)\s*=\s*(.*?);$""")
    php_config={}
    with open(phpConfigFile) as fileObject:
    for line in fileObject.readlines():
    for match in pattern.finditer(line):
    php_config[match.group(2)] = match.group(3).replace('"', '')
    if 'dbhost' in php_config:
    mysqlHost = php_config['dbhost']
    else:
    mysqlHost = "127.0.0.1"
    if 'dbport' in php_config:
    mysqlPort = php_config['dbport']
    else:
    mysqlPort = 3306
    mysqlLogin = php_config['dbuser']
    mysqlPass = php_config['dbpass']
    mysqlDatabase = php_config['database']
    except Exception as error:
    print("Error reading config.php: %s" % str(error))


    # This handles console colors used for print's
    #http://misc.flogisoft.com/bash/tip_colors_and_formatting
    class c:
    ENDC='\33[0m'
    DEFAULT='\33[39m'; BOLD='\33[1m'; DIM='\33[2m'
    RESBOLD='\33[21m'; RESDIM='\33[22m'
    RED='\33[31m'; GREEN='\33[32m'; YELLOW='\33[33m'; CYAN='\33[36m'


    #https://github.com/liftoff/GateOn…erminal.py#L358
    def strtranslate(from_str):
    translations = (
    (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'),
    (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'),
    (u'\N{LATIN SMALL LETTER A WITH DIAERESIS}', u'ae'),
    (u'\N{LATIN CAPITAL LETTER A WITH DIAERESIS}', u'Ae'),
    (u'\N{LATIN CAPITAL LETTER O WITH DIAERESIS}', u'Oe'),
    (u'\N{LATIN CAPITAL LETTER U WITH DIAERESIS}', u'Ue'),
    (u'\N{LATIN SMALL LETTER SHARP S}', u'ss'),
    # et cetera
    )
    out = from_str
    for from_str, to_str in translations:
    out = out.replace(from_str, to_str)
    return out


    class DhtSensorController():
    def __init__(self, sensorType, gpioPin):
    self.sensorType = sensorType
    self.gpioPin = gpioPin

    def readData(self):
    if self.sensorType == 11:
    sensor = Adafruit_DHT.DHT11
    elif self.sensorType == 22:
    sensor = Adafruit_DHT.DHT22
    elif self.sensorType == 23:
    sensor = Adafruit_DHT.AM2302
    else:
    self.readSuccess = False
    raise Exception("Unknown sensor type. Use 11 for DHT11, 22 for DHT22 and 23 for AM2302")

    # Try to grab a sensor reading. Use the read_retry method which will retry up
    # to 15 times to get a sensor reading (waiting 2 seconds between each retry).
    humidity, temperature = Adafruit_DHT.read_retry(sensor, self.gpioPin, retries=15, delay_seconds=2)
    if humidity is not None and temperature is not None:
    #temp = Decimal(temperature)
    #hum = Decimal(humidity)
    #self.temperature = Decimal(temp.quantize(Decimal('.01'), rounding=ROUND_HALF_UP))
    #self.humidity = Decimal(hum.quantize(Decimal('.01'), rounding=ROUND_HALF_UP))
    self.temperature = format(temperature, '.2f')
    self.humidity = format(humidity, '.2f')
    self.readSuccess = True
    else:
    self.readSuccess = False
    print('Failed to get reading. Try again!')


    def get_data():
    for sensorPlace in sensor_dict:
    sensorPlace = strtranslate(sensorPlace)
    sensorType, sensorGPIO = sensor_dict.get(sensorPlace).split(';')
    DHT = DhtSensorController(int(sensorType), int(sensorGPIO))
    DHT.readData()
    if DHT.readSuccess:
    print('{0} -> {1}C , {2}%'.format(sensorPlace, DHT.temperature, DHT.humidity))
    add_data(sensorPlace, DHT.temperature, DHT.humidity)
    else:
    print('{} -> None'.format(sensorPlace))


    def add_data(Place, Temp, Hum):
    con = None
    try:
    con = cymysql.connect(host=mysqlHost, port=int(mysqlPort), user=mysqlLogin, passwd=mysqlPass)
    cur = con.cursor()
    cur.execute("CREATE DATABASE IF NOT EXISTS %s;" % mysqlDatabase)
    cur.execute("USE %s;" % mysqlDatabase)
    con.commit()
    cur.execute("CREATE TABLE IF NOT EXISTS data (id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,location VARCHAR(255),timestamp INT(11),temp FLOAT(11),hum FLOAT(11),KEY location (location)) ENGINE=InnoDB DEFAULT CHARSET=utf8;")
    con.commit()
    cur.execute("INSERT INTO data (timestamp, location, temp, hum) VALUES (%s,%s,%s,%s);", (int(time.time()), Place, Temp, Hum))
    con.commit()
    except Exception as err:
    print(c.BOLD+c.RED+"MySQL Error: "+str(err)+c.ENDC)
    except (KeyboardInterrupt, SystemExit):
    sys.exit()
    finally:
    try: cur.close()
    except: pass
    try: con.close()
    except: pass


    if __name__ == '__main__':
    try:
    get_data()
    except (KeyboardInterrupt, SystemExit):
    print("\nSchliesse Programm..")

    #EOF
    [/php]


    Mittlerweile habe ich davon auch eine andere Version auf Basis von bottle entwickelt, die gänzlich ohne den apache2 Traktor und PHP aus kommt - evtl. für dich besser :huh: => https://github.com/meigrafd/HighCharts__python

  • Hallo meigrafd,

    genial, es funktioniert wunderbar! Vielen Dank !!!

    Ich schau mir die Bottle-Version sehr gerne mal an. Werde aber wohl dabei bleiben. Auf dem Pi läuft eh der lighttpd. Brauch ich für´s SmartHomeControl wo ich die Graphen auch integriert hab.

    Nochmal ein dicken Dank und einen Guten Rutsch ins neue Jahr!

    Beste Grüße
    Karsten

  • Hi.
    Super das du noch da noch dabei bist!
    Sogar eine neue Version. Finde ich Toll!! :thumbs1:

    An dem DHT-Skript ist ja einiges geändert worden.
    Das alte läuft ja bei mir, gibt so jetzt also keinen Grund da etwas zu ändern.
    Neugierig bin ich da aber schon. Warum gehts bei mir und nicht bei 'ilovepis'?

    Hat deine Bottle-Version eigentlich das Sunset/Sunrise mit drin? :D

  • Aus verschiedenen Gründen mußte ich HighCharts neu installieren.

    1. habe ich mysql-server mysql-client php5-mysql, dann

    2. Apache2, und

    3. das Script von meigrafd installiert

    System RaspiB1 mit Jessie, 8 GB SD card. Nach gut einem Dutzen Versuchen in den letzten Tagen mit Raspi2, 16 GB, zurückspielen div. Sicherungen, immer kommt wie folgt:


    \n";
    foreach ($Chart AS $PERIOD => $DESCRIPTION) { echo "• Last ".$PERIOD."


    \n";
    }
    echo "\n";

    //------------------------------------------------------
    // Content / Charts
    //------------------------------------------------------

    echo "\n";
    echo " \n";
    echo " \n";

    if (isset($_GET['period'])) { $Period = $_GET['period'];
    ?>

    \n"; // END: content

    //------------------------------------------------------
    // Footer
    //------------------------------------------------------
    /*
    echo "\n\n";
    echo "



    \n";
    $DURATION_end = microtime(true);
    $DURATION = $DURATION_end - $DURATION_start;
    echo "

    Page generated in ".round($DURATION, 3)." seconds

    \n";
    echo "
    \n";
    */
    ?>

    Als Zitat ist es mir auch nicht gelungen. Ich hoffe es findet sich ein kundiger und hilfsbereiter Mensch. Ich komme nicht mehr weiter.

    Die übrigen Programme, zB. fb-switch gehen auch nicht mehr.

  • Hallo Meigrafd und Gemeinde,

    es hat mit dem Projekt ja soweit alles geklappt. Ich konnte alles verbauen und messen.

    Die Tage wird es sogar wieder an den nächsten Platz versetzt.

    Ich schreibe weil ich 2 Fragen zu der Ausgabe habe. Ich hoffe sehr das mir da jemand helfen kann.

    1.

    Die Ausgabe der Temperatur-Chart über 4 Wochen hinaus klappt nicht auf meinem Webserver. Auf dem Raspberry wird es nach einer Denkpause angezeigt. (Die Datenbank bzw der Datensatz ist 10MB groß)


    Die Feuchtemessung hingegen wird bis 6Montate korrekt ausgegeben (12 wiederum nicht).

    Könnte das am Webserver liegen und der Rechenzeit oder am Skript, oder beides?

    Den Quell-Code habe ich schon verglichen, mir ist kein Unterschied aufgefallen. Das ein oder andere Fragezeichen hab ich allerdings schon.

    Im Grunde sollte ja nichts über 4 Monate erfasst werden. Jetzt ist aber doch mal 1 Jahr (354 Tage) draus geworden. :angel:

    Bei den anderen beiden Datensätzen ist mir das nicht aufgefallen. Die haben nur 47 & 82 Tage.


    2.

    Wäre es sehr kompliziert die Charts so anzeigen zu lassen?

    .....Demo: https://www.highcharts.com/stock/demo/compare

    Die Zeitleiste unten ist sehr komfortabel!


    Ich hoffe es findet sich jemand der hier unterstützen kann.

  • Aus verschiedenen Gründen mußte ich HighCharts neu installieren.

    1. habe ich mysql-server mysql-client php5-mysql, dann

    2. Apache2, und

    3. das Script von meigrafd installiert

    System RaspiB1 mit Jessie,

    Hi,

    Die Frage ist bei mir leider unter gegangen.

    Soweit ich mich noch erinnere hat sich mit Jessie einiges geändert. Das alles wurde noch auf und für Wheezy erstellt.

    Ich denke da gibt es sogar dazu einen Kommentar in diesem Thema. Bin mir nicht sicher.

    Ich hoffe das hilft dir schon mal weiter.

    Weiterhin hatte ich mir mal eine kleine *liesmich* als Hilfe geschrieben.

    Ich füge die mal hier mit an.

    Spoiler anzeigen

    //Einrichten lighttpd , php, mysql , phpmyadmin ,

    sudo apt-get update

    sudo apt-get install lighttpd

    sudo /etc/init.d/lighttpd restart

    sudo apt-get install php5-cgi

    sudo apt-get install mysql-server

    sudo nano /var/www/info.php #Server und PHP testen bzw anzeigen

    <?php

    phpinfo();

    ?>

    sudo lighty-enable-mod fastcgi

    sudo lighty-enable-mod fastcgi-php

    sudo /etc/init.d/lighttpd restart

    sudo nano /etc/lighttpd/lighttpd.conf

    server.dir-listing = "enable"

    dir-listing.external-css = "/dir.css"

    dir-listing.hide-dotfiles = "enable"

    dir-listing.exclude = ( "dir.css" )

    dir-listing.encoding = "utf-8"

    sudo apt-get install phpmyadmin

    sudo /etc/init.d/lighttpd restart

    sudo cp /etc/phpmyadmin/lighttpd.conf /etc/lighttpd/phpmyadmin.conf

    sudo /etc/init.d/lighttpd restart

    sudo nano /etc/modules #Module für den Systemstart laden. Siehe auch weiter unten.

    w1-gpio pullup=1

    w1-therm

    sudo apt-get install htop # Prozesse besser anzeigen und auch filtern.

    sudo apt-get install python-mysqldb #für Python

    Ich habe weiter keine Extraschritte durchgeführt.

    Keine Config wegen fast-cgi oder php bearbeitet bzw erweitert.

    ################## Ausschalten und Neustart per Mausklick (USB) #########################

    sudo nano /etc/triggerhappy/triggers.d/halt.conf #Datei erstellen und mit folgendem Inhalt

    BTN_LEFT+BTN_MIDDLE 1 /usr/bin/sudo /sbin/halt

    sudo nano /etc/triggerhappy/triggers.d/reboot.conf

    BTN_RIGHT+BTN_MIDDLE 1 /usr/bin/sudo /sbin/reboot

    Es muß die zuletzt angegebene Taste zuerst gedrückt werden.

    Also erst mittlere Maus, dann rechte/linke Taste.

    Der Benutzer "pi" ist bereits in /etc/sudoers entsprechend eingetragen.

    Daher ist es am sinnvollsten, triggerhappy mit den Rechten von pi zu starten:

    sudo nano /etc/default/triggerhappy

    DAEMON_OPTS="--user pi"

    Es gibt Raspian-Versionen, die haben modifizierte Start-Skripte,

    und in einem dieser Skripte wird der Start von Triggerhappy annulliert.

    Oder er wird nach kurzer Zeit wieder gestoppt.

    Achte also darauf, ob "/usr/sbin/thd" einige Minuten nach dem Start noch in der Prozesstabelle auftaucht.

    Hierfür ist htop sehr gut geeignet!


    ############## für 1-wire vorbereiten #############

    //http://www.kompf.de/weather/pionewiremini.html

    1-wire Softwaretreiber

    Die für die Ansteuerung des 1-wire Temperatursensors erforderlichen Kernelmodule

    sind Bestandteil der Linux-Distribution Raspbian "wheezy".

    Man muss sie allerdings explizit laden:

    Neuere Versionen des Raspbian Betriebssystems ab Kernel 3.18 (Februar 2015)

    erfordern zusätzlich die Aktivierung des Device Tree Overlay für 1-wire.

    Dazu editiert man (per sudo nano oder einem anderen Editor Ihrer Wahl) die Datei

    /boot/config.txt und fügt folgende Zeile hinzu:

    # Aktivierung des Device Tree Overlay fuer 1-Wire

    dtoverlay=w1-gpio,gpiopin=4,pullup=on

    Nach dem erforderlichen Reboot gelingt nun auch das Laden der erforderlichen Module per Kommandozeile:

    sudo modprobe w1-gpio pullup=1

    sudo modprobe w1-therm

    Wichtig ist der Parameter pullup=1, der dem Modul mitteilt, dass eine parasitäre Speisung über einen Pullup-Widerstand vorhanden ist.

    Die Module legen im Verzeichnis /sys/bus/w1/devices jeweils ein Unterverzeichnis für jeden gefundenen Sensor an.

    Der Name des Verzeichnisses setzt sich aus dem Family-Code des Sensors und seiner eindeutigen Identifikationsnummer zusammen.

    In jedem Unterverzeichnis gibt es die Datei w1_slave, die Sensorstatus und gemessenen Temperaturwert enthält.

    cd /sys/bus/w1/devices

    cd 28-000801b5*

    cat w1_slave

    0f 00 4b 46 ff ff 06 10 0c : crc=0c YES

    0f 00 4b 46 ff ff 06 10 0c t=2375

    Die Datei besteht aus zwei Zeilen, die jeweils den hexadezimalen Registerdump des Sensor-ICs enthalten. Am Ende der ersten Zeile steht die Prüfsumme (CRC) und die Information, ob es sich um einen gültigen Messwert handelt (YES). Die zweite Zeile endet mit dem Temperaturmesswert in tausendstel Grad Celsius. Im Beispiel beträgt die Temperatur also 7,375 °C. Die Genauigkeit auf drei Stellen hinter dem Komma ist natürlich nur scheinbar; dem Datenblatt des DS18S20 entnimmt man zum Beispiel, dass die Messgenauigkeit ±0,5 °C beträgt. Die tatsächliche Temperatur liegt also irgendwo zwischen 6,8 und 7,9 °C.

    ###################### Module beim Systemstart laden #######################

    Wenn alles soweit funktioniert, dann sollte man die beiden erforderlichen Module in die Datei

    /etc/modules eintragen, damit sie der Kernel in Zukunft automatisch beim Systemstart lädt:

    # /etc/modules

    w1-gpio pullup=1

    w1-therm

    ###################### crontab ######################

    crontab -e #Eintragen von Cronjobs

    */40 * * * * ping -c 1 192.168.22.1

    führt alle 40 Minuten 1 Ping an die IP aus

    Zum Beispiel um den Wlan-Adapter von edimax nicht in den Energiesparmodus zu lassen.

    */40 * * * * ping -c 1 192.168.22.1

    */15 * * * * /home/pi/temp.py > /home/pi/templog.log

    */15 * * * * sudo /usr/local/sbin/dht.py > /home/pi/humlog.log

    BZW

    */40 * * * * ping -c 1 192.168.22.1

    0,15,30,45 * * * * /home/pi/temp.py > /home/pi/templog.log

    0,15,30,45 * * * * sudo /usr/local/sbin/dht.py > /home/pi/humlog.log

    58,13,28,43 * * * * sudo /home/pi/lol_dht22/loldht 6 > /home/pi/humlog-loldht-6.log

    57,12,27,42 * * * * sudo /home/pi/lol_dht22/loldht 3 > /home/pi/humlog-loldht-3.log


    ##################### WLan-Adapter Edimax ####################

    sudo nano /etc/network/interfaces #sollte etwa so aussehen. Lan ist hier fest, wlan dhcp

    auto lo

    iface lo inet loopback

    auto eth0

    allow-hotplug eth0

    iface eth0 inet manual

    auto wlan0

    allow-hotplug wlan0

    iface wlan0 inet dhcp

    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

    iface default inet dhcp


    Netzwerk neu starten mit:

    /etc/init.d/networking restart

    WPA_GUI mit root-Rechten öffnen. > Menü > Run > gksu wpa_gui

    Dann den Adapter auswählen, scannen und Netzwerk wählen. Passwort eingeben und hinzufügen.


    ###################### #####################

  • Ein Stück weiter bin ich gekommen. Nur noch zu keiner Lösung.

    Es liegt wohl an der Größe der Datenbank.

    Ich habe zum Testen eine neue erstellt und diese manuell gefüllt. Mit weniger Daten über 12 Monate.

    Da klappt die Anzeige problemlos auf dem Webserver.

    Es scheint also das hier das Problem zu suchen ist.

    Gibt es denn irgendwo eine Zeitbegrenzung?

    Evtl. wird dann wohl ein eigenes Thema besser sein?

  • Entschuldige erstmal für die super späte Rückmeldung!

    Privat und Arbeit wars wiedermal sehr angespannt! :-/ . Und Grippe war auch dazwischen :X

    Ein Error-Log hat es nicht ausgegeben.

    Auf dem Webserver ist auch kein Error-Log eingetragen.

    Evtl mach ich da was falsch.

    Ich hatte die Tage mit dem Support gesprochen. Er vermutete zu wenig Speiche (48MB).

    Also wurde testweise auf 256MB erhöht. Keine Änderung!

    Nun wurde in der ini-Datei die "max_execution_time" von 5 auf 30 erhöht. Auch keine Änderung!

    Die Datenbank wird doch ohnehin vollständig eingelesen (etwa11MB) um die gewünschte Zeit aus zu geben, richtig?

    Dann spielt der Speicher und die Zeit doch gar keine Rolle, oder??


    Viele Grüße!

  • Update.

    Es hängt wohl am Webhoster.

    Hatte alles nochmal auf meiner Synology DS eingerichtet. Dort klappt, wie auf dem Raspi, ebenfalls alles reibungslos.

    Nur das der Pi eben etwas langsamer ist.

    Somit sollte zu Fehlersuche ein eigenes Thema her.

    Evtl kann es ein Mod ab Beitrag 87 abtrennen?!

    Überschrift: Highcharts werden nicht vollständig geladen.

    Viele Grüße

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!