Selbstaktualisierende Page mit webpy

Django, Flask, Bottle, WSGI, CGI…
Antworten
chiefhood
User
Beiträge: 1
Registriert: Mittwoch 10. Juni 2015, 09:09

Hallo Ihr,

ich versuche gerade von einem Raspberry Sensordaten, die als ein String vorhanden sind auf dem Browser darzustellen.
Dies funktioniert schon mit Webpy jedoch nicht ohne automatische Aktualisierung.
Ich möchte, wenn ich auf die Homepage gehe, dass sich diese alle 2-3 Sekunden aktualisiert, so dass ich die aktuellen Sensordaten als String bekomme.

Wie kann ich das machen?

Hier mail mein Code:

Code: Alles auswählen

import web
import RPi.GPIO as GPIO
import sys
import smbus
import Adafruit_MCP9808.MCP9808 as MCP9808

urls = (
    '/', 'index'
)

class index:
    def GET(self):
		bus = smbus.SMBus(1)
		sensor1 = MCP9808.MCP9808(0x18,busnum=1)
		sensor1.begin()
		sensor2 = MCP9808.MCP9808(0x19,busnum=1)
		sensor2.begin()
		sensor3 = MCP9808.MCP9808(0x1a,busnum=1)
		sensor3.begin()
		sensor4 = MCP9808.MCP9808(0x1c,busnum=1)
		sensor4.begin()
		temp1 = sensor1.readTempC()
		temp2 = sensor2.readTempC()
		temp3 = sensor3.readTempC()
		temp4 = sensor4.readTempC()
		
		average = (temp1 + temp2 + temp3 + temp4)/4
		
    return "Average-Temp: "+str(average)+", Out-Temp: "+str(temp1)+", In-Temp: "+str(temp2)+"Heater: "

if __name__ == "__main__":
	
    app = web.application(urls, globals())
    app.run()

Schon mal Vielen Dank im Vorraus!

Grüße!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich würde die Finger von webpy lassen ;) Aber das nur neben bei...

Beste Lösung wäre vermutlich einen Push Lösung... Einfacher wird wohl ein simple AJAX Variante sein. z.B. per jQuery in Abständen die neuen Daten in html einbauen...

Noch einfacher (aber unschön) ist es wohl die html Seite ständig zu reloaden: https://en.wikipedia.org/wiki/Meta_refresh

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@chiefhood: bei so einer einfachen Webseite reicht der refresh über meta-Tag

Code: Alles auswählen

<meta http-equiv="refresh" content="5">
Wenn Du anfängst, variablen durchzunummerieren willst Du eigentlich mit Listen arbeiten. Statt den String zusammenzustückeln, solltest Du nach Stringformatierung schauen. Deine Einrückung ist kaputt. Achte darauf, dass immer mit 4 Leerzeichen pro Ebene eingerückt wird und nicht Tabs und Leerzeichen gemischt werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jens hat geschrieben: Beste Lösung wäre vermutlich einen Push Lösung...
Über WebSockets? Oder wolltest Du auf etwas anderes hinaus?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie man das konkret verwirklichen kann weiß ich nicht.

Generell war nur der Gedanke, das eine Aktualisierungs-Schleife ineffizient ist und man besser Benachrichtigt werden könnte, wenn ein Wert sich geändert hat...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Naja echtes Push geht nur websockets, ein Fake-Push geht mittels long polling (Leitung offen halten, neue Daten pushen, Leitung clientseitig wieder aufbauen/offenhalten etc...)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Websockets sind konzeptionell hier nicht wirklich notwendig, da man ja nichts zum Server schicken möchte. Server Sent Events (SSE) würde vollkommen ausreichen und ist serverseitig leicher zu implementieren.

Sowohl Websockets als auch SSE ist aber wesentlich aufwendiger als meta-refresh oder eine JS Lösung die jede Sekunde per Ajax neue Informationen abfragt. Vorallem wenn es meta-refresh auch schon tut, kann man bei Websockets definitiv nicht mehr von einer effizienten Lösung sprechen, zumindest wenn man die eigene Arbeitszeit mit einbezieht.
Antworten