Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Hoe negeer je foutmeldingen in Python?

Pagina: 1
Acties:

  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
Ik heb een script (deels) geschreven die middels RRD-tools een grafiek maakt
van de gegevens van mijn "slimme meter".

Omdat ik mijn momentane energieverbruik wil monitoren wordt dit grafiek iedere
10 seconden gegenereerd en weggeschreven naar mijn site alwaar dat grafiek
ook weer iedere 10 seconden wordt ververst.

Nu zit er een conflict in het script, er zijn momenten dat het grafiek wordt
weggeschreven en op het zelfde moment wordt uitgelezen. En dan strandt
mijn script. Omdat het iedere 10 seconden moet worden uitgevoerd kan ik
er geen cronjob van maken (minimaal 1 minuut).

Nu mijn vraag. Hoe vang ik die fout af op een manier dat de volgende 10
seconden gewoon wéér geprobeerd wordt het grafiek te genereren en alsnog
weg te schrijven.

Let wel, dit probleem doet zich dus onwillekeurig voor een a twee keer per dag.

Ik heb al iets geprobeerd met Except en pass maar dat werkt niet goed.
Het script stopt toch. Daarnaast zou ik graag gelogd willen hebben welke
foutmeldingen er precies zijn zodat ik gerichter naar het probleem kan kijken.
Ik heb echter de juiste logfiles (met datum) niet kunnen vinden.

Ik gebruik de Raspberry voor als dat interessant is.

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


  • Merethil
  • Registratie: December 2008
  • Laatst online: 08:50
Kan je niet doen dat het opgevraagd wordt wanneer je website het opvraagt? Dus Python script start pas wanneer je op je site komt? Lijkt me veel efficienter...

  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
Exceptions afvangen doe je met een try/catch/finally combinatie.

Python:
1
2
3
4
5
6
try:
    iets_wat_exception_kan_genereren()
[except [<type van exception> [as <variabele naam die exception informatie zal hebben>]]:
    code_om_exception_af_te_vangen()]
[finally:
    code_die_ten_allen_tijde_wordt_uitgevoerd_aan_het_einde()]


Alles in [] is optioneel.. let wel, dat je OF een except handler hebt, OF een finally, of beide, maar niet geen van beide hebt.
het exception blok kan je ook meer dan eens laten voorkomen, zolang je voor elk blok een andere exception type gebruikt.. zo kan je 1 functie die meerdere types exceptions kan geven, afhandelen op de juiste manier voor de juiste exception.


Om terug te gaan naar je probleem; probeer eerst een schets te maken wat je precies wilt bereiken, want volgens mij probeer je het veel te moeilijk te maken voor wat je er mee wilt.... denk daarbij aan de volgende vragen:
- is het -nodig- om elke 10 seconden een grafiek te maken? (kijk je 24 uur per dag, 7 dagen per week, elke 10 seconden naar nieuwe informatie? )
- Is het -nodig- dat je rasbpi de grafiek maakt en die door stuurt?

Wat je namelijk ook kan doen is als volgt:
- je raspberry houdt de gegevens bij, en slaat deze op in een RRD
- je site (op zich een vage term, wellicht dat je dit wat uitlegt, is het een shared host, is het een VPS, een dedicated server?) haalt deze RRD periodiek op (of andersom, je rasbpi stuurt hem naar de server)
- zodra jij op een bepaalde pagina komt op je site, maakt hij van de RRD een grafiek met de data.


Als je site wat meer is dan enkel een shared host, dan is het zelfs mogelijk om met bestaande software een hele hoop te bereiken, zonder dat je al te veel hoeft te programmeren.

  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
Laat ik even wat uitleggen, op voorhand dat ik een zeer gematigde kenner ben in alles.

Het gaat hier om de slimme meter, daar zijn uiteraard andere topics voor maar het betreft
imo een python truc waar ik naar op zoek ben. Wellicht is er een andere en betere oplossing.

Om eerlijk te zijn weet ik niet precies waar het probleem ligt. Ik denk aan een conflict met ftp
maar zal het uitleggen.

Op mijn site; http://ccvd.eu/Energie.html heb ik 4 grafieken die gegenereerd worden door RRD.
3 van die grafieken geven aan wat er globaal aan energiestromen zijn (heen of terug afhankelijk van de zon)

Het eerste grafiek gebruik ik voor mijn momentaan gebruik opdat ik direct kan zien of er ineens
een spontane grote verbruiker in huis is, vandaar (helaas) die 10 seconden. Anders had ik het wel
gegoten in een cronjob, die start sowieso ieder moment weer een nieuwe taak.

Dus één grafiek wordt iedere keer naar de server weggeschreven alwaar ook mijn pagina staat.
Ik heb in mijn pagina opgenomen dat het eerste grafiek iedere 10 seconden moet worden ververst.
De overige 3 is niet boeiend en die worden ook respectievelijk 10 minuten en één uur ververst.
Die gaan ook altijd goed en bij (toch) een fout start de cronjob gewoon opnieuw.

Nu terug naar het probleem. Ik denk . . . . dat wanneer het script (zie fragment;
'LINE0.5:leveren#000000:',
'LINE0.5:verbruik#000000:',)

try:
f = open("basis10minuten.png", "rw")
ftp.storbinary("STOR basis10minuten.png", f)
f.close()
time.sleep(11)
except:
f.close()
time.sleep(11)
pass
de file naar mijn server schrijft er op dat moment het bestand of in gebruik is (dat wegschrijven) of
dat het bestand wordt ingelezen (dat weet ik dus niet).

Ik had gehoopt met de bovenstaande Try . . .Except . . . iets te ondervangen maar helaas.

Realiseer je dat ik in alles een beginner ben, veel lees en weinig snap maar probeer te volharden . . .


En nu wat ik wil bereiken en bereikt heb;
- slimme meter uitlezen met een Python script en schrijven naar een RRD database (dat lukt al maanden)
- 4 grafieken genereren met RRD-tools, ook dat gaat redelijk voortreffelijk
- grafieken op mijn site zetten (3 van de 4 gaat dus goed)

Nog te doen is, mijn zonne-inverter uitlezen en de waarden verdisconteren met de slimme meter
(wacht op de goede kabel uit de USA)

De meter uitlezen is ook een continue proces, de meter genereert iedere 10 seconden een telegram
met meetgegevens. Maar nogmaals daar is een ander topic voor, het ging mij om het Python probleem.

Ik hoop wat duidelijker te zijn geweest en in spannende afwachting van je reactie.

Vriendelijke groet,

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
Merethil schreef op dinsdag 29 oktober 2013 @ 21:44:
Kan je niet doen dat het opgevraagd wordt wanneer je website het opvraagt? Dus Python script start pas wanneer je op je site komt? Lijkt me veel efficienter...
Ik zou niet weten hoe dat moet en . . . ik weet ook niet zeker of daar het probleem is.
Ik weet dat er waarschijnlijk gevochten wordt om een bestand maar op welk niveau is
niet duidelijk. Ik kan ook geen logfile vinden waar dat expliciet in staat.
Of de data die weggeschreven wordt voor het grafiek icm het ophalen van die data geeft conflicten
Of het bestand waarin het grafiek wordt weggeschreven icm het kopieren van deze file naar mijn
site geeft het conflict.

Dat weet ik dus niet.

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Wellicht een domme opmerking, maar kun je niet 6 cronjobs maken? Die starten ieder 10 seconden na elkaar en herhalen elke minuut.

  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
HuHu schreef op woensdag 30 oktober 2013 @ 21:11:
Wellicht een domme opmerking, maar kun je niet 6 cronjobs maken? Die starten ieder 10 seconden na elkaar en herhalen elke minuut.
Ik denk griezelig slim. . . . . ik weet alleen niet of je seconden aan kunt geven in een cronjob.

Kortom, dat weet ik niet. Dat ga ik iig uitzoeken.

Update; voor zover ik het nu bekijk kun je slechts met een minimum van 1 minuut schakelen.

[ Voor 10% gewijzigd door con1 op 30-10-2013 21:51 ]

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


Verwijderd

rrdcached -w 10

Vervolgens praat je via een socket met de daemon om de data te dumpen of retrieven. Dat zou goed moeten gaan, bij het ophalen van de data gebeurt dat bovendien goeddeels uit de cache.

Overigens zou ik niet elke 10 seconden schrijven, maar om de paar minuten. De cache daemon houdt alles bij in het geheugen. Bij een crash ben je alleen wat in het geheugen stond kwijt, maar dat is een risico dat je zult moeten incalculeren. Je spaart er heel wat onnodige disk I/O mee uit.

  • Tomaszke
  • Registratie: Oktober 2012
  • Laatst online: 05-07-2021
con1 schreef op woensdag 30 oktober 2013 @ 21:47:
[...]


Ik denk griezelig slim. . . . . ik weet alleen niet of je seconden aan kunt geven in een cronjob.

Kortom, dat weet ik niet. Dat ga ik iig uitzoeken.

Update; voor zover ik het nu bekijk kun je slechts met een minimum van 1 minuut schakelen.
Je kan eventueel wel met sleep werken in cron:

* * * * * /path/to/script
* * * * * sleep 10 && /path/to/script
* * * * * sleep 20 && /path/to/script
* * * * * sleep 30 && /path/to/script
* * * * * sleep 40 && /path/to/script
* * * * * sleep 50 && /path/to/script

Verwijderd

Maar laten we dat maar niet doen, want dat is echt een inferieure oplossing.

  • brambo123
  • Registratie: December 2006
  • Laatst online: 22-11 16:55
i.p.v. python de bestanden te laten uploaden naar ftp zou er je ook voor kunnen kiezen om curlftpfs te gebruiken.

  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
Verwijderd schreef op woensdag 30 oktober 2013 @ 22:20:
Maar laten we dat maar niet doen, want dat is echt een inferieure oplossing.
Het is wel weer heel erg inventief . . . .

Maar goed, ik ga alle reacties bestuderen en zien wat mij het beste past.

Iedereen bedankt voor het meedenken en de oplossingen.

Één ding is zeker, ik heb vertrouwen dat het helemaal gaat lukken.

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.


  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 15:38
De simpelste oplossing lijkt me om de bestandsnamen gewoon timestamps mee te geven. Dus in plaats van "basis10minuten.png" wordt het "basis10minuten_20131030224255.png" bijvoorbeeld. Op je site kan je dan sorteren op datum en de laatste laten zien. Het probleem wat je dan hebt is dat je ftp volloopt, maar dat is geen onoverkomelijk probleem.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
Als je site host de rrd extensies heeft voor bepaalde talen, kan je ook gewoon de RRD uploaden met FTP, en dan on-demand daar grafieken uit trekken.. zo hoef je niet constant grafieken te genereren...

bedenk namelijk wel, het maken van die grafieken, tenzij je het in een tmpfs doet, elke 10 seconden een schrijfactie zal zijn.. als je dat op een raspberry's SD kaart doet, voorspel ik je dat je binnen een jaar een nieuwe sd kaart kan kopen.

  • con1
  • Registratie: Juni 2005
  • Laatst online: 14:29

con1

Energiefreak

Topicstarter
DXaroth schreef op donderdag 31 oktober 2013 @ 01:12:
Als je site host de rrd extensies heeft voor bepaalde talen, kan je ook gewoon de RRD uploaden met FTP, en dan on-demand daar grafieken uit trekken.. zo hoef je niet constant grafieken te genereren...

bedenk namelijk wel, het maken van die grafieken, tenzij je het in een tmpfs doet, elke 10 seconden een schrijfactie zal zijn.. als je dat op een raspberry's SD kaart doet, voorspel ik je dat je binnen een jaar een nieuwe sd kaart kan kopen.
Dat de SD kaart belast wordt is wel bekend. ik zou ook graag de kleine files in het interne geheugen doen laten plaatsvinden, het zijn tenslotte piepkleine png-filetjes en zeer vluchtig maar heb geen notie hoe dat dan aan te pakken.
Voorts zijn alle script enorm klein. De SD kaart is ook bizar groot (8MB) maar ik wist van te voren niet, bij de
aanschaf (een complete noob), waar ik aan begon . . .

Ik ben niet gek, ik ben anders. Blij als een ei met mijn Hyundai Inster Pulse.

Pagina: 1