[Bottle] HTML automatisch aktualisieren

Django, Flask, Bottle, WSGI, CGI…
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo BlackJack

Das mit dem 'while True' ist einleuchtend. Ich habe dies stumpf 1:1 aus meinem Konsolen-Programm so übernommen. Auch wurde nun eine ID anstelle eines Tags im Template eingefügt. Ich habe noch eine Variable 'global alarm' in Verwendung, weil ich so den Zustand auch nach dem Schliessen des Browser speichern kann. Da ich eh schon eine DB habe, wäre es wohl besser, dies direkt in die DB zu schreiben und abzufragen. (?)
BlackJack hat geschrieben:Wenn man sowieso schon regelmässig die Anzahl der Bewegungen abfragt, könnte man auch gleich den Zustand des Schalters mitliefern. Dann könnte man den auch immer aktualisieren.
Der Sensor liefert nur 1 oder 0 zurück. Also wenn eine Bewegung erkannt wird, dann ist der GPIO Input ("GPIO.input(PIR_PIN)") für ca. 1/2 Sekunde auf 1 und dann wieder auf 0.

Code: Alles auswählen

def get_time_of_motion():
    time_of_motion = dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return time_of_motion
    
    
def counter(func):
    @wraps(func)
    def tmp(*args, **kwargs):
        tmp.count += 1
        tmp.motion_time = get_time_of_motion()
        tmp.motion_liste = create_motion_list()
        return func(*args, **kwargs)

    tmp.count = 0
    tmp.motion_time = '0:0:0:0'
    tmp.motion_liste = []
    return tmp


motion_list = []


def create_motion_list():
    motion_list.append([get_motion.count, get_motion.motion_time])
    return motion_list

    
@app.route('/info',  method='POST')
def info_post():
    global alarm
    GPIO.setup(PIR_PIN, GPIO.IN)
    alarm =  int(request.forms.get('checkbox'))
    
    if alarm == 1:
        print 'Start PIR-Sensor'
        GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=get_motion)

    elif alarm == 0:
        print 'Exit'
        GPIO.cleanup()

Code: Alles auswählen

% rebase('layout', title='Informations', username=username)
<div class="container">
  <h2>Bla Bla 1</h2>
  <p class="page-header">Bewegungsmelder ein oder ausschalten</p>
  <h4>Alarmanlage:  <status>{{alarm}}</status></h4>
  <input type="checkbox" name="my-checkbox">
  <hr>
  <div id="my_table"></div>
  </div>

Code: Alles auswählen

      $("#my_table").load( "bewegung" );
       var refreshId = setInterval(function() {
         $("#my_table").load( "bewegung" );
        }, 1000);
Ausgabe:

Code: Alles auswählen

Bewegung	Datum
1	2014-10-09 14:37:17
2	2014-10-09 14:37:26
3	2014-10-09 14:37:40
4	2014-10-09 14:38:10
5	2014-10-09 14:38:29
6	2014-10-09 14:38:46
7	2014-10-09 14:39:04
8	2014-10-09 14:39:12
EDIT:
Ups, hab gerade noch gesehen, dass im Template noch ein Tag '<status>' anstelle einer ID ist. Muss ich noch ändern.
BlackJack

@lackschuh: Mit Schalter meine ich den „Alarm ist an/aus”-Schalter, also Dein globales `alarm`. Nicht die Hardware die da abgefragt wird.

Du übertreibst das echt mit dem Dekorator und was Du da alles als Attribute an die Funktion heftest. Eine Klasse wäre hier glaube ich deutlich verständlicher.

Und die neue globale Variable `motion_list` ist auch unschön. Das `motion_liste`-Attribut wird gesetzt aber überhaupt nicht verwendet!?

Das Anhängen von konkreten Typen an Namen ist auch nicht gut. Vielleicht ändert man ja irgendwann mal den Typ, zum Beispiel zu einer `collections.deque` damit man nicht *alle* Bewegungen sammelt sondern nur die letzten x Bewegungen. Und dann ist der Name plötzlich falsch und man muss den überall ändern.

Die '/info'-URL gibt gar nichts zurück‽ Würde ich bei dem Namen aber irgendwie erwarten.
Antworten