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.
- Ruco
- Thread is marked as Resolved.
-
-
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.Muss auch dazusagen ich hab wenig Ahnung vom scripten, bau halt nach oder um, um ein bisschen zu lernen.
Beste Grüße
Karsten -
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Ä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 outclass 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: passif __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
=> 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?
-
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.
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.
//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?
-
-
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.
-
-
Wenn es nicht das Timeout ist: was sagt das Error-Log des Webservers?
-
-
Entschuldige erstmal für die super späte Rückmeldung!
Privat und Arbeit wars wiedermal sehr angespannt!
. Und Grippe war auch dazwischen
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
-
-
-
Das geht nicht, die Funktion gibt es nicht
-
Darum hatte ich dbv schon per PN angeschrieben
Schon verrückt das es die Funktion nicht gibt.