Hallo,
ich Programmiere aktuell einen µC der als kleiner Server, Messwerte
weitergeben soll.
Eigentlich funktioniert alles super, wenn ich in den Browser bsw.
"192.168.1.210/Messwert1" eingebe, bekomme ich als Antwort "10.0 °C".
Ich habe bewusst auf den html Frame verzichtet.
Als nächstes möchte ich diesen Messwert in meine lokale Webseite
einbinden. Das ganze jedoch ohne Frame!
z.B.
Der aktuelle Messwert lautet <192.168.1.210/Messwert1> ......
angezeigt werden soll:
Der aktuelle Messwert lautet 10.0 °C ......
Kann mir jemand sagen, wie die Syntax lautet?
MfG
pindrei
Pindrei P. schrieb:> Kann mir jemand sagen, wie die Syntax lautet?
geht so nicht. Du sollte die Antwort als JSON ausliefern. Dann kann man
mit JavaScript die Daten laden und dann in der Webseite darstellen.
mmmh, schade.
Auf Dauer sollen die Daten eh in eine Datenbank abgelegt werden, daher
ist eine direkte Datenbankabfrage wohl die Lösung.
Wie ich die Daten in die MySQL-Datenbank bekomme kann ich auch noch
nicht sagen. Ich dachte an JavaScript, habe mich aber noch nicht
eingearbeitet.
Danke für die Hilfe.
Pindrei P. schrieb:> mmmh, schade.
Wieso schade?
Ändere deine µC-Webseite.
Statt "10,0 °C" gibst du aus
{"temp":10.0}
mit Content-type application/json
in deiner Webseite baust du (z.B) jquery und kleines Script ein
Optimierung: "/Messwert1" aus der URL rausnehmen, den µC alle Messwerte
auf einmal ausspucken lassen
{
"temp1":10.42,
"temp2":21.7,
"battery":3.89
...
}
Pindrei P. schrieb:> Hallo,>> ich Programmiere aktuell einen µC der als kleiner Server
Die andere Alternative lautet, dass du in deinen Server einen
Mechanismus einbaust, der sich das auszuliefernde HTML ansieht und dort
'Schlüsseltokens' mit dem jeweiligen Messwert ersetzt, ehe dann das so
umgeänderte HTML endgültig rausgeht.
Viele AVR basierte 'Server' arbeiten nach dieser Methode.
Vorteil: es ist meistens recht einfach zu implementieren
Nachteil: es ist in keinster Weise irgendwie standardisiert, was nach
einiger Zeit insofern ein Problem aufwirft, dass man selber nicht mehr
weiss, welche Token es gibt und was sie bewirken. Und natürlich: dein
Nachfolger wird sich erst mal wundern.
Karl H. schrieb:> Die andere Alternative lautet, dass du in deinen Server einen> Mechanismus einbaust, der sich das auszuliefernde HTML ansieht und dort> 'Schlüsseltokens' mit dem jeweiligen Messwert ersetzt, ehe dann das so> umgeänderte HTML endgültig rausgeht.
Ja die Lösung habe ich bereits umgesetzt, wenn sich in der html-Seite
eine Zeichenkette wie z.B. %Messwert% befindet, wird ein Array aus
Strukturen nach den Namen zwischen den %-Zeichen durchsucht und die
Variable + Einheit ausgegeben. Im µC-Programm arbeite ich dann direkt
mit dieser Struktur. Jedoch werden nachher mehrere Server zur
Messdatenerfassung benötigt.
Die Lösung mit dem JSON habe ich nun auch implementiert. Jetzt fehlt nur
noch das Javascript. Dazu muss ich mich aber erst einmal über die
Erstellung einer JavaScript-Seite informieren.
Danke für die Hilfe.
erweitern, jedoch bekomme ich jedes mal die Fehlermeldung "$ is not
defined". Wenn ich das Skript um ein "var $;" erweitere wird es nicht
besser.
Wie ich Werte ausgebe, bzw. darauf zugreife habe ich auch noch nicht
verstanden. Wie gesagt, mit javaScript und dem Anlegen von Webseiten
habe ich nahezu keine Erfahrung.
Pindrei P. schrieb:> erweitern, jedoch bekomme ich jedes mal die Fehlermeldung "$ is not> defined". Wenn ich das Skript um ein "var $;" erweitere wird es nicht> besser.> Wie ich Werte ausgebe, bzw. darauf zugreife habe ich auch noch nicht> verstanden. Wie gesagt, mit javaScript und dem Anlegen von Webseiten> habe ich nahezu keine Erfahrung.
da die Webseite eine andere ist, als die quelle deiner Daten hast du
vermutlich das "Same-Origin" Problem.
https://de.wikipedia.org/wiki/Same-Origin-Policy
setze mal noch den Header
Access-Control-Allow-Origin: *
Pindrei P. schrieb:> Wie ich Werte ausgebe, bzw. darauf zugreife habe ich auch noch nicht> verstanden. Wie gesagt, mit javaScript und dem Anlegen von Webseiten> habe ich nahezu keine Erfahrung.
.. dann hast Du wahrscheinlich auch noch kein jQuery eingebunden, in die
Webseite, oder?
Achim H. schrieb:> .. dann hast Du wahrscheinlich auch noch kein jQuery eingebunden, in die> Webseite, oder?
mmh ich glaube nicht, nur das script und der Rest ist html.
Peter II schrieb:> setze mal noch den Header>> Access-Control-Allow-Origin: *
ich habe den header im µC-Server erweitert:
"HTTP/1.1 200 OK\r\nContent-Type:
application/json;charset=UTF-8;\nAccess-Control-Allow-Origin: *\r\n\r\n"
hat aber leider nicht geholfen.
Pindrei P. schrieb:> Hier die komplette HTML-Seite:
Kein jquery drinnen. Das muss da rein.
Entweder runterladen und selber ausliefern, oder z.B. die Google-server
mitbenutzen:
Peter II schrieb:> dann binde doch erst mal jquery ein.
ich glaube das war der Fehler. Jetzt bekomme ich keine Fehlermeldung
mehr. Wie gesagt, mein erster Tag mit Javaskript. Jetzt fehlt nur noch
eine Ausgabe.
Arc N. schrieb:> Warum immer jquery oder anderes Zeug was erst aus diversen Ecken des> Internets geladen werden muss? XMLHttpRequest gibt es seit ~10 Jahren
warum nicht C(++) wenn es doch seit Jahren asm gibt.
Vervollständige doch mal dein Beispiel damit aus auch funktioniert, dann
siehst du warum.
Warum machen nur immer alle aus keinem Problem ein JQuery Problem?
Peter II schrieb:> Pindrei P. schrieb:>> Kann mir jemand sagen, wie die Syntax lautet?>> geht so nicht. Du sollte die Antwort als JSON ausliefern. Dann kann man> mit JavaScript die Daten laden und dann in der Webseite darstellen.
Natürlich geht das! Warum denn auch nicht?
Peter II schrieb:> Pindrei P. schrieb:>> Jetzt funktioniert auch die Ausgabe, jedoch ohne Nachkommastellen....>> einfach mal debuggen. Bringt ja jeder Browser schon mit.
OK, in der JSON-Abfrage werden auch keine Kommata angezeigt.....
Daniel A. schrieb:> Warum machen nur immer alle aus keinem Problem ein JQuery Problem?
weil es einfacher ist - sieht man ja an der länge von deinem Code
document.body.innerHTML
bitte ein Konkretes Objekt aktualisieren.
Pindrei P. schrieb:> läuft! Verwirrt mit aber ein wenig...
Das hört irgendwann auf.
Peter II schrieb:> document.body.innerHTML>> bitte ein Konkretes Objekt aktualisieren.
document.querySelector("#werte").innerHTML = xy;
Pindrei P. schrieb:> für mich ist es so vollkommen ausreichend.
Naja... ein "setInterval", dass alle X Sekunden die Temperatur neu
abfragt und einsetzt sollte schon noch sein :)
Planlos schrieb:> Naja... ein "setInterval", dass alle X Sekunden die Temperatur neu> abfragt und einsetzt sollte schon noch sein :)
Guter Tip, wurde direkt mit eingesetzt.
Planlos schrieb:> Ich nehm an dein Projekt ist nicht kommerziell?>
...glücklicher weise nicht, ansonsten wäre das Pojekt im minus. Die JBs
wollte ich anfangs selber erstellen, da ich aber schon aus dem Zeitplan
bin, werde ich wohl die vorgefertigten nehmen. Die Internetseite macht
einen guten Eindruck.
....so mittlerweile bin ich an dem Punkt angekommen, an dem ich beginnen
will, die Daten in eine SQL-Datenbank zu schreiben.
Dafür verwende ich natürlich ein Raspberry Pi und Python. Jedoch habe
ich noch ein Probleme mit der JSON-Abfrage.
1
#!/usr/bin python
2
3
importurllib2
4
importjson
5
6
url="http://192.168.1.210/get"
7
8
if__name__=="__main__":
9
req=urllib2.Request(url)
10
opener=urllib2.build_opener()
11
f=opener.open (req)
12
json=json.load(f)
13
14
print"Controller gefunden ! \n"
15
foriteminjson:
16
printitem
17
18
try:
19
print"%02d"%(item["test1"])
20
except:
21
print"??"
als Ausgabe bekomme ich:
1
Controller gefunden !
2
3
test1
4
??
5
test2
6
??
7
test3
8
??
9
test4
10
??
Die Json-Ausgabe des µC sieht so aus:
1
{
2
"test1": 111.00,
3
"test2": 222.00,
4
"test3": 333.00,
5
"test4": 444.00
6
}
Es sind zumindest schon einmal die Variablennamen, die ich im µC
hinterlegt habe. Jedoch würde ich auch gerne die Variablenwerte
angezeigt, bzw. weiterverarbeiten bekommen.
Kann mir jemand sagen, wie ich die Werte angezeigt bekomme?
Arc N. schrieb:> Warum immer jquery oder anderes Zeug was erst aus diversen Ecken des> Internets geladen werden muss? XMLHttpRequest gibt es seit ~10 Jahren>>
1
> var req = new XMLHttpRequest();
2
> req.onreadystatechange = function() {
3
> if (request.readyState == 4 && request.status == 200) {
4
> // do something with req.responseText here
5
> }
6
> };
7
> req.open('GET', aUrl);
8
> req.send();
9
>
weil ich bei jquery weiß das es in allen browsern vernünftig laufen
wird.
Hast du dein code mal im IE probiert?
Pindrei P. schrieb:> print "%02d" % (item["test1"])
Ich hab mit Python nix am Hut, aber das sieht falsch aus. Das sollte
vmtl. eher json[item] oder so ähnlich sein.
Pindrei P. schrieb:> Dirk D. schrieb:>> Hast du dein code mal im IE probiert?>> Hab ich unter Linux und auf dem Tablett nicht.......
Ich auch nicht, aber wenn ich jQuery benutze hab ich an der stelle ein
gutes Gefühl das es auch für Leute ausserhalb meiner blase funktioniert
:)
Konrad S. schrieb:> Ich hab mit Python nix am Hut, aber das sieht falsch aus. Das sollte> vmtl. eher json[item] oder so ähnlich sein.
ja würde ich auch sagen, ich hatte anfangs es mit
1
item.get('test1')
versucht, jedoch auch ohne Erfolg. Auch stehen in item nur die
Variablennamen, jedoch keine Werte. Ich vermute, dass der Fehler beim
einlesen ist.
1
json = json.load(f)
Woher soll der Compiler wissen, dass eine Fließkommazahl kommt? Wobei
meine ersten Erfahrungen mit Python und Java Skript gezeigt haben, dass
es keine Datentypen mehr gibt.
Als C Programmierer ist eine Welt zusammengebrochen.
Pindrei P. schrieb:> item.get('test1')
Es kann sein, dass ich falsch liege, aber item iteriert über die
JSON-Daten, d.h. es steht für ein einzelnes Element (oder nur dessen
Key?). Du musst das übergeordnete Objekt befragen, deshalb schrieb ich
> json[item]
Konrad S. schrieb:> Pindrei P. schrieb:>> item.get('test1')>> Es kann sein, dass ich falsch liege, aber item iteriert über die> JSON-Daten, d.h. es steht für ein einzelnes Element (oder nur dessen> Key?). Du musst das übergeordnete Objekt befragen, deshalb schrieb ich>>> json[item]
jep, in item steht der name und mit
1
print json[item]
bekomme ich jetzt auch die Variable angezeigt.
besten Dank
... nun stehe ich vor dem nächsten Problem. Ich habe eine Tabelle in
MySQL angelegt, wo der 1.Typ von Typ Datetime und der zweite und dritte
vom Typ Float sind.
Wenn ich direkt in der Eingabeaufforderung arbeite, kann ich mit:
INSERT INTO tabelle(Zeit,test1,test2) VALUES(NOW(),'1.1','1.1')
einen Datensatz anlegen.
jedoch wird er mit python nicht angelegt. Es gibt auch keine
Fehlermeldung.
1
#!/usr/bin python
2
3
importurllib2
4
importsimplejson
5
importMySQLdbasmdb
6
importsys
7
8
url="http://192.168.1.210/get"
9
10
try:
11
con=mdb.connect('localhost','pi','pi','stromdb')
12
cur=con.cursor()
13
cur.execute("INSERT INTO tabelle(Zeit,test1,test2) VALUES(NOW(),'1.1','1.1')")
Pindrei P. schrieb:> Hat jemand eine Idee, was ich falsch mache?
Ja du solltest mal erst ein Grundlagenbuch lesen anstatt hier ständig
jedes neue triviale Mikroproblemchen auszuwalzen.
Onkel Tom schrieb:> Ja du solltest mal erst ein Grundlagenbuch lesen anstatt hier ständig> jedes neue triviale Mikroproblemchen auszuwalzen.
Grundsätzlich muss ich dir recht geben, leider habe ich nur ein Buch
über MySQL & php und ein Buch über python ohne MySQL, daher habe ich
mich an dem Beispiel unter "http://zetcode.com/db/mysqlpython/";
gehalten. Jedoch fehlt da anscheinend im Absatz "Creating and populating
a table" ein:
con.commit()
um die Daten an den Server zu übertragen. Jetzt funktioniert es.
Pindrei P. schrieb:> cur.execute("INSERT INTO tabelle(Zeit,test1,test2)> VALUES(NOW(),'1.1','1.1')")
Ich hoffe du setzt später deine Werte nicht per String-Concat da ein,
sondern verwendest da parametrisierte Queries.
Planlos schrieb:> Pindrei P. schrieb:>> cur.execute("INSERT INTO tabelle(Zeit,test1,test2)>> VALUES(NOW(),'1.1','1.1')")>> Ich hoffe du setzt später deine Werte nicht per String-Concat da ein,> sondern verwendest da parametrisierte Queries.
mmh ja genau so habe ich es gemacht. Über die Sicherheit habe ich mir
keine Gedanken gemacht, da das ganze Projekt nur intern im lokalem
Netzwerk läuft.
1
#!/usr/bin python
2
3
importurllib2
4
importsimplejson
5
importMySQLdbasmdb
6
importsys
7
8
url="http://192.168.1.210/get"
9
10
Anfrage="";
11
name=""
12
values=""
13
try:
14
req=urllib2.Request(url)
15
opener=urllib2.build_opener()
16
f=opener.open (req)
17
json=simplejson.load(f)
18
print"Controller gefunden ! \n"
19
foriteminjson:
20
printitem
21
printjson[item]
22
23
try:
24
printitem+" = "+str(json[item])
25
name=name+", "+item
26
values=values+", "+str(json[item])
27
28
except:
29
print"??"
30
con=mdb.connect('localhost','pi','pi','stromdb')
31
cur=con.cursor()
32
Anfrage="INSERT INTO HZ_Neues_Haus(Zeit "+name+") VALUES(NOW() "+values+");"
33
cur.execute(Anfrage)
34
con.commit()#Schreibt die Daten in die Datenbank (Absenden!)
35
con.close()
36
print"In Datenbank geschrieben!\n"
37
printAnfrage
38
39
exceptmdb.Error,e:
40
print"Error %d: %s"%(e.args[0],e.args[1])
41
sys.exit(1)
das ganze rufe ich jetzt alle 15 min als cronjob auf.....
Anscheinend funktioniert es. Man könnte es noch verbessern, in dem man
die Spalten der Datenbank beim 1. Aufruf dynamisch erstellt. Ich habe es
jetzt per Hand gemacht.