Suche Programmierer. Datenbank auslesen und visualisieren per Highcharts.

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


  • 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

    Edited once, last by ilovepis ().

  • 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/quest…iables-from-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/Gat…terminal/terminal.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.

  • 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.


  • 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?

  • PHP hat eine Zeitbegrenzung fuer die Laufzeit eines Scripts. Wenn das Script zu lange laeuft, wird es abgebrochen.


    Das Limit kann in php.ini eingestellt werden.

  • Hi Tell,


    der Raspberry und der Webserver sind jeweils mit 30 Sekunden eingetragen.


    Code
    ini_set('max_execution_time', '30');

    Habs auch mit 130 Sekunden versucht. Ohne Erfolg.

  • 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

  • Weil ich nicht denke, das die Mods und Admins hier _alles_ lesen, ist es IMHO besser einen oder mehrere zu erwähnen: dbv, Turael und ps915 z.B. ;)

    Darum hatte ich dbv schon per PN angeschrieben ;)

    Schon verrückt das es die Funktion nicht gibt.