Energiemeter uitlezen met Raspberry Pi, code crasht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Allereerst, ik ben ontzettend niet handig met linux en python maar wil toch graag mijn niet slimme energiemeter uitlezen. Om dit te doen heb ik een ldr voor de led gehangen en deze aangesloten op mijn raspberry pi. Bij elke pulse van de led krijg ik netjes een signaal op de gekozen pin. Dit is mijn code om elke puls per uur op te slaan in een mysql database:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#! /usr/bin/python

#import some needed stuff
import RPi.GPIO as GPIO
import MySQLdb
from time import sleep
from datetime import datetime

#setup gpio
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) 

#hourly updater
#don't forget the ` on columns with only numbers
def hourly_updater(pulses):
    hour = datetime.now().hour
    
    try:
        db = MySQLdb.connect('localhost', 'root', 'root', 'domotica')
        cursor = db.cursor()
        cursor.execute("INSERT INTO electricity_hourly_totals (date, `%s`) VALUES(CURDATE(), %s) ON DUPLICATE KEY UPDATE `%s`=`%s`+%s", (hour, pulses, hour, hour, pulses))
        db.commit()
        
        #close up everything
        cursor.close()
        db.close()
        #logging.info('pulse logged')
        
    except MySQLdb.Error, e:
        #logging.critical('query failed: %s', cursor._last_executed)
        #logging.critical('MYSQL error: %d: %s', e.args[0], e.args[1])
        if db:
            db.rollback()
            db.close()
        pass
        

#main loop
while True:
    GPIO.wait_for_edge(25, GPIO.RISING)
    hourly_updater(1)
    #sleep for a bit to avoid a false second trigger
    sleep(0.1)
    #GPIO.wait_for_edge(25, GPIO.FALLING)


het scriptje start ik automatisch / handmatig middels een init ding in init.d volgens deze website:
http://blog.scphillips.co...und-as-a-service-on-boot/

Dit werkt allemaal prima echter compleet willekeurig houdt het programma op met draaien en ik kan niet uitvinden waarom. Ik heb sys.stderr al naar een testbestand laten schrijven maar deze blijft leeg.

kan iemand met meer python kennis me in de goede richting schoppen? Waar / hoe zou ik eventueel kunnen achterhalen waarom mijn scriptje stopt met werken?

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Nu online
Trekt het script je CPU niet toevallig helemaal dicht?

Hier staat ook nog een scriptje: http://www.hyggeit.dk/201...ap-web-enabled-power.html kun je daar wat mee misschien?

Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Geloof het niet. Volgens top blijft het zo'n beetje op onderstaand niveau tot hij ineens weer gecrasht is.
Afbeeldingslocatie: http://tweakers.net/ext/f/ZlcmFE3drAS7mtxbWCz6JIa9/full.png

in de tijd dat hij gelopen heeft is er 1060 watt gebruikt dus zijn er 1060 pulses opgeslagen naar de database. Je zou dus denken dat hij capaciteit genoeg heeft.

nu ik het plaatje zo zie is VIRT wel heel hoog. Hoger dan mysql bijvoorbeeld. nu eens uitzoeken wat dat dan is

[ Voor 13% gewijzigd door Kaasplank op 28-12-2014 19:59 ]


Acties:
  • 0 Henk 'm!

  • BugBoy
  • Registratie: November 2002
  • Laatst online: 13-09 09:01
Ik zou proberen niet elke keer je SQL verbinding te openen en te sluiten. Wat gebeurt er als je de verbinding open houdt?

The miracle isn't that I finished. The miracle is that I had the courage to start.


Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Ik ben er al wel achter dat hij hangt op het wait_for_edge gedeelte. Alleen dat stuk zonder mysql crasht ook. Dat vervangen voor een add_event_detect op de gpio pin en dan

Python:
1
2
3
While True
    if GPIO.event_detected(25)
         hourly_updater(1)

en hij werkt wel gedurende de hele dag. Weet alleen nog niet of hij wel alle pulsen pakt.

Acties:
  • 0 Henk 'm!

  • jobr
  • Registratie: Januari 2009
  • Laatst online: 26-07 21:40
Ik zou het eerlijk gezegd wat anders doen. Per puls loggen is wel heel veel data. En die pulsen kunnen wel eens snel komen. Zet de oven en wasmachine maar eens aan.

Ik zou een interrupt routine maken die de pulsen en de duur tussen de pulsen telt.
In de main loop dan 1 keer in de 60 sec mbv aantal pulsen en tijdsduur het aantal watt of KWH berekenen en dan dit opslaan in de db. Dan loop je ook minder de kans dat je wat mist.

Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Daar zat ik ook al aan te denken. Met een scheduler of iets dergelijks elke minuut de pulsen wegschrijven. Overigens heeft hij zo in een uur al eens 3600 watt geregistreerd. Geloof dus niet dat de pi het er echt moeilijk mee heeft. Elke minuut iets wegschrijven geeft me trouwens wel een mooi uitgangspunt voor het berekenen van het huidige gebruik
Pagina: 1