probleem try function.... Python

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Paul_Heijden
  • Registratie: Januari 2019
  • Laatst online: 15-03-2021
Mijn vraag
Ik heb een stukje software gemaakt om de alarmen van de brandweer in te lezen.
Dit alarm wil gebruiken om mijn verlichting te schakelen zodat ik dat niet zelf hoef te doen op mijn weg naar de kazerne.

Nu is hier al wel het eea over te vinden op het internet.
Dus ik ben daar al wel ver mee. Ik kan in de terminal al eea printen dus dat is erg leuk.

ik heb echter 2 problemen waar ik tegen aan loop wat wellicht 1 probleem is maar ik omschrijf ze apart.
1. Ik heb standaard stukje software aangepast op de website van de P2000 to raspberry en hierin word de try functie gebruikt. Echter heb ik het idee dat wanneer ik dit programma start er niets anders meer word uitgevoerd.
Dus wanneer ik een variabelen wil importeren in een ander project dan doet die niets tot ik eea kill..
2. Ik heb een Magic Mirror project waarmee ik door een sys.stdout.write(Var_to_Mirror) functie een string kan laten zien.
maar ook dit werkt niet zodra ik de try functie toevoegd

Relevante software en hardware die ik gebruik
Python 3
Software tot nu toe.


code:
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
45
46
47
48
49
50
51
52
53
54
55
import time
import sys
import subprocess
import os
import re
from datetime import datetime
from dateutil import tz
from termcolor import colored
from lcd2usb import LCD

capcode_Steenbergen= "001200768"
capcodeToFind_List= ["001200768","001220499","001420999"]
meldingToFind_List= ["A4","N275"]
Uitruk_Steenbergen =0
lcd = LCD()


def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

with open('error.txt','a') as file:
    file.write(('#' * 20) + '\n' + curtime() + '\n')

multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)


try:
    while True:
        line=multimon_ng.stdout.readline()
        multimon_ng.poll()
        if line.__contains__("ALN"):
            if line.startswith('FLEX'):
                flex = line[0:5]
                timestamp = line[6:25]
                melding = line[58:]
                groupid = line[35:41]
                capcode = line[45:54]
                print ("Alarm! " + curtime() + melding + capcode)
                      
            #Find Capcode in Capcode lijst
                if (str(capcode))in capcodeToFind_List:
                    print ("Code: "+(str(capcode))+" gevonden in de lijst")
            #Find Post steenbergen In de Capcode
                if capcode_Steenbergen in (str(capcode)):
                    Uitruk_Steenbergen =1
                            
                 
                sys.stdout.write("test test test")    

        
except KeyboardInterrupt:
    os.kill(multimon_ng.pid, 9)

[ Voor 3% gewijzigd door Paul_Heijden op 25-01-2019 16:34 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
Zet je code even tussen de [code] tags :)

Ik kan geen Python, maar je leest die file in en vervolgens maak je een endless loop die elke keer dezelfde readout gaat verwerken. Je moet dat inlezen in de loop zetten. En ik zou er even iets van een sleep in zetten, elke 20 seconde checken is genoeg toch?

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 09-09 17:16
Ik ken geen Python, maar ik ken ook geen taal welke deze syntax gebruikt:

code:
1
shell=True)

Acties:
  • +2 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

RedHat schreef op vrijdag 25 januari 2019 @ 16:18:
Ik ken geen Python, maar ik ken ook geen taal welke deze syntax gebruikt:

code:
1
shell=True)
Dan ken je inderdaad geen Python ;)

Acties:
  • 0 Henk 'm!

  • zonoskar
  • Registratie: Januari 2000
  • Laatst online: 12:42

zonoskar

<-- Mika R.I.P!

RedHat schreef op vrijdag 25 januari 2019 @ 16:18:
Ik ken geen Python, maar ik ken ook geen taal welke deze syntax gebruikt:

code:
1
shell=True)
Dat stukje hoort bij subprocess.Popen(). Maar zoals al gezegd, zet je code tussen [ code ] tags, want indentation is alles in Python.

Powermac G5 casemod. Mijn PV live output. | Ioniq 6 Style 77kWh Ultimate Metallic Red 18" RWD


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 09-09 17:16
zonoskar schreef op vrijdag 25 januari 2019 @ 16:24:
[...]

Dat stukje hoort bij subprocess.Popen(). Maar zoals al gezegd, zet je code tussen [ code ] tags, want indentation is alles in Python.
8)7 Ja, zie het nu, was niet super leesbaar 8)7

Acties:
  • 0 Henk 'm!

  • Paul_Heijden
  • Registratie: Januari 2019
  • Laatst online: 15-03-2021
Hallo dank je voor de reactie tot nu toe. Ik heb de post aangepast met de code []

Acties:
  • 0 Henk 'm!

  • Paul_Heijden
  • Registratie: Januari 2019
  • Laatst online: 15-03-2021
418O2 schreef op vrijdag 25 januari 2019 @ 16:17:
Zet je code even tussen de [code] tags :)

Ik kan geen Python, maar je leest die file in en vervolgens maak je een endless loop die elke keer dezelfde readout gaat verwerken. Je moet dat inlezen in de loop zetten. En ik zou er even iets van een sleep in zetten, elke 20 seconde checken is genoeg toch?
Is dit nog steeds relevant ? zou je er een voorbeeld van willen geven ?
Punt is dat de variabel niet altijd iets bevat. Dit is dus alleen als er een melding door gestuurd word via P2000/multimon_ng. Daarom word de try functie gebruikt verwacht ik

[ Voor 3% gewijzigd door Paul_Heijden op 25-01-2019 16:39 ]


Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 10:19
Om (op een redelijk primitieve manier) wat meer te debuggen en er achter te komen waar het fout gaat zou ik wat vaker een
code:
1
print("1")
(en 2, 3, 4, en eventueel wat waardes van variabelen) statements toevoegen. Jouw sys.stdout.write("test test test") wordt alleen geprint als

code:
1
2
        if line.__contains__("ALN"):
            if line.startswith('FLEX'):


True zijn.

(edit: tweede if-statement toegevoegd)

[ Voor 23% gewijzigd door RedPixel op 25-01-2019 16:46 ]

I see red pixels.


Acties:
  • 0 Henk 'm!

  • Paul_Heijden
  • Registratie: Januari 2019
  • Laatst online: 15-03-2021
RedPixel schreef op vrijdag 25 januari 2019 @ 16:42:
Om (op een redelijk primitieve manier) wat meer te debuggen en er achter te komen waar het fout gaat zou ik wat vaker een
code:
1
print("1")
toevoegen. Jouw sys.stdout.write("test test test") wordt alleen geprint als
code:
1
if line.__contains__("ALN"):
True is.
Hoi.
Klopt. De variable "line" bevat de volgende string als er een melding binnen komt
FLEX: 2019-01-25 15:46:25 1600/2/K/A 11.087 [002029568] ALN A2 (DIA: ja) 13179 Rit 10405 Amstelveen Etna 1186CN

FLEX staat voor het protocol en ALN is dat er een alarm is.

Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 10:19
Paul_Heijden schreef op vrijdag 25 januari 2019 @ 16:47:
[...]

Hoi.
Klopt. De variable "line" bevat de volgende string als er een melding binnen komt
FLEX: 2019-01-25 15:46:25 1600/2/K/A 11.087 [002029568] ALN A2 (DIA: ja) 13179 Rit 10405 Amstelveen Etna 1186CN

FLEX staat voor het protocol en ALN is dat er een alarm is.
Ik snapte dat je een regel aan het parsen bent.
Ik probeer je alleen maar duidelijk te maken dat je geen idee hebt hoe ver je programma komt en waar dingen fout gaan als je niet wat meer output print :)


edit: ik snap je vragen echter niet helemaal:
Dus wanneer ik een variabelen wil importeren in een ander project dan doet die niets tot ik eea kill..
Wat bedoel je met variabelen importeren? Een variabele bestaat altijd maar in 1 programma, daarbuiten kun je die niet uitlezen.
Ik heb een Magic Mirror project waarmee ik door een sys.stdout.write(Var_to_Mirror) functie een string kan laten zien.
maar ook dit werkt niet zodra ik de try functie toevoegd
sys.stdout.write("") is een wat kalere manier om een print("") te doen. Wat bedoel je precies met "werkt niet"? Welk gedrag verwacht je, en welk gedrag zie je?
Als je ons niet de code laat zien met wat je probeert, kunnen wij niet uitvogelen wat er verkeerd gaat.

[ Voor 38% gewijzigd door RedPixel op 25-01-2019 16:54 ]

I see red pixels.


Acties:
  • 0 Henk 'm!

  • Paul_Heijden
  • Registratie: Januari 2019
  • Laatst online: 15-03-2021
RedPixel schreef op vrijdag 25 januari 2019 @ 16:49:
[...]

Ik snapte dat je een regel aan het parsen bent.
Ik probeer je alleen maar duidelijk te maken dat je geen idee hebt hoe ver je programma komt en waar dingen fout gaan als je niet wat meer output print :)
Dank je wel voor het mee denken ! word zeker op prijs gesteld. Enkel dit stukje programma werkt opzich zelf goed. Dus in de terminal word ook geprint wat ik verwacht. Dus dat is mooi.
Nogmaals de code in het P2000.py project:
code:
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
45
46
47
48
49
50
51
52
53
54
import time
import sys
import subprocess
import os
import re
from datetime import datetime
from dateutil import tz
from termcolor import colored

capcode_Steenbergen= "001200768"
capcodeToFind_List= ["001200768","001220499","001420999"]
meldingToFind_List= ["A4","N275"]
Uitruk_Steenbergen =0



def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

with open('error.txt','a') as file:
    file.write(('#' * 20) + '\n' + curtime() + '\n')

multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)


try:
    while True:
        line=multimon_ng.stdout.readline()
        multimon_ng.poll()
        if line.__contains__("ALN"):
            if line.startswith('FLEX'):
                flex = line[0:5]
                timestamp = line[6:25]
                melding = line[58:]
                groupid = line[35:41]
                capcode = line[45:54]
                #print ("Alarm! " + curtime() + melding + capcode)
                
            #Find Capcode in Capcode lijst
                if (str(capcode))in capcodeToFind_List:
                    print ("Code: "+(str(capcode))+" gevonden in de lijst")
            #Find Post steenbergen In de Capcode
                if capcode_Steenbergen in (str(capcode)):
                    Uitruk_Steenbergen =1
                            
                 
                   

        
except KeyboardInterrupt:
    os.kill(multimon_ng.pid, 9)


Echter zou ik dus graag een variabelen zo als "melding" in een ander python project gebruiken dmv
code:
1
2
3
 from P2000 import melding

print(melding)


Echter dit laatste werkt dus niet dit gebeurt er dus als ik het 2de python project start.
code:
1
2
3
4
5
6
pi@RP_van_Paul:~/src $ sudo python test.py
Code: 001220499 gevonden in de lijst
Code: 001220499 gevonden in de lijst
^CN A2 Falckstraat SGRAVH : 15119

pi@RP_van_Paul:~/src $


Dus pas als ik de code stop dmv een ctrl + c ( dit zie je op de regel door ^C) commando geeft hij de string die als laatste in de string "Melding" zit
Ik wil dat dat continu gebeurt

[ Voor 44% gewijzigd door Paul_Heijden op 25-01-2019 17:06 ]


Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 10:19
Ah, dat komt omdat als je test.py aanroept, hij pas verder gaat met het uitvoeren van test.py zodra hij klaar is met de module P2000 (jouw P2000.py) laden. Daar is hij echter pas klaar mee zodra jouw
code:
1
    while True:

klaar is. En dat is natuurlijk nooit, tenzij jij hem zelf afbreekt met Ctrl + c.

Los daarvan is dit natuurlijk alleen nuttig als er uberhaupt iets in je variabele melding staat.

Hier kun je een paar oplossingen voor bedenken:
1. doe meteen iets met meldingin je while True: loop, als er iets in meldingwordt gezet (aan het einde van je loop)
2. roep vanuit je while True loop een functie aan die iets met meldingdoet, zet deze functie eventueel in test.py (dan moet je dus de import vanuit de andere file doen)
3. doe iets moeilijks met meerdere threads en polling of events (nee, doe maar niet)

Ik zou voor optie 2 gaan, zodra er een parse-baar berichtje binnenkomt, doe je er iets mee in een functie.

Los daarvan nog een paar tips:
- Je hebt nu best veel code binnen in je loop staan. Ik zou dit splitsen in functies. De gebruikelijke regel is: een functie doet 1 ding (en is bij voorkeur herbruikbaar, maar das nu minder belangrijk).
- Je importeert nog veel dingen die je niet gebruikt, waarschijnlijk overblijfselen, maar ik zou ze weglaten.
- Dit is nog niet zoveel code, en dat wordt het ook nog niet, dus ik zou het lekker in 1 bestand laten staan.

I see red pixels.


Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 10:19
Even als voorbeeldje heb ik je code wat omgegooid naar hoe ik het zou doen. Let op: niet getest en misschien heb ik wat te rigoureus zitten weggooien ;)

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
45
46
47
48
49
50
51
52
53
54
55
56
import time
import subprocess
import os

capcode_steenbergen = "001200768"
capcode_list = ["001200768","001220499","001420999"]
meldingToFind_List = ["A4","N275"]


def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

def alert_capcode(capcode, melding):
    print("Code: "+(str(capcode))+" gevonden in de lijst")
    #doe hier iets met melding ofzo

def alert_steenbergen(melding):
    # doe hier iets met de melding

def valid(line):
    return line.startswith('FLEX') and "ALN" in line


def parse(line):
    flex = line[0:5]
    timestamp = line[6:25]
    groupid = line[35:41]
    capcode = line[45:54]
    melding = line[58:]
    return (flex, timestamp, groupid, capcode, melding)
        
def check_for_alert():
    line = multimon_ng.stdout.readline()
    
    if valid(line):
        (flex, timestamp, groupid, capcode, melding) = parse(line)
        if capcode in capcode_list:
            alert_capcode(capcode, melding)
        if capcode is capcode_steenbergen:
            alert_steenbergen(melding)
            
def main():
    with open('error.txt','a') as file:
        file.write(('#' * 20) + '\n' + curtime() + '\n')
    multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)
    while True:
        try:
            check_for_alert()
        except KeyboardInterrupt:
            os.kill(multimon_ng.pid, 9)

if __name__ == "__main__":
    main()

[ Voor 1% gewijzigd door RedPixel op 25-01-2019 22:42 . Reden: sleep weggehaald ]

I see red pixels.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 15-09 20:13

Matis

Rubber Rocket

Ik kreeg even kriebels in mijn buik toen ik de TS las.
Ik ben namelijk zelf ook een vrijwilliger in de VRMWB en heb namelijk exact hetzelfde gegaan als jij hier probeert te bereiken.

Ik lees de P2000 codes uit en bij de juiste capcode(s) worden er diverse acties uitgevoerd.
Lichten aan, PC locken, berichtje naar mijn vrouw. Etc

Je bent al een eind op weg en ik wil je graag verder helpen. Op dit moment heb ik niet de mogelijkheid om de code te bekijken, maar ik kom er na het weekend graag op terug.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Elfjes
  • Registratie: Januari 2007
  • Niet online
RedPixel schreef op vrijdag 25 januari 2019 @ 18:35:
Even als voorbeeldje heb ik je code wat omgegooid naar hoe ik het zou doen. Let op: niet getest en misschien heb ik wat te rigoureus zitten weggooien ;)

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
45
46
47
48
49
50
51
52
53
54
55
56
57
import time
import subprocess
import os

capcode_steenbergen = "001200768"
capcode_list = ["001200768","001220499","001420999"]
meldingToFind_List = ["A4","N275"]


def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

def alert_capcode(capcode, melding):
    print("Code: "+(str(capcode))+" gevonden in de lijst")
    #doe hier iets met melding ofzo

def alert_steenbergen(melding):
    # doe hier iets met de melding

def valid(line):
    return line.startswith('FLEX') and "ALN" in line


def parse(line):
    flex = line[0:5]
    timestamp = line[6:25]
    groupid = line[35:41]
    capcode = line[45:54]
    melding = line[58:]
    return (flex, timestamp, groupid, capcode, melding)
        
def check_for_alert():
    line = multimon_ng.stdout.readline()
    
    if valid(line):
        (flex, timestamp, groupid, capcode, melding) = parse(line)
        if capcode in capcode_list:
            alert_capcode(capcode, melding)
        if capcode is capcode_steenbergen:
            alert_steenbergen(melding)
            
def main():
    with open('error.txt','a') as file:
        file.write(('#' * 20) + '\n' + curtime() + '\n')
    multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)
    while True:
        try:
            check_for_alert()
            sleep(5) # anders is hij continu bezig met proberen te lezen
        except KeyboardInterrupt:
            os.kill(multimon_ng.pid, 9)

if __name__ == "__main__":
    main()
Sleep is niet nodig, readline() is gewoon blocking. Sterker nog, als je meer dan 1 bericht per 5 seconden krijgt ga je hiermee achterlopen

Bla bla bla...


Acties:
  • 0 Henk 'm!

  • RedPixel
  • Registratie: Januari 2004
  • Laatst online: 10:19
Elfjes schreef op vrijdag 25 januari 2019 @ 22:38:
[...]


Sleep is niet nodig, readline() is gewoon blocking. Sterker nog, als je meer dan 1 bericht per 5 seconden krijgt ga je hiermee achterlopen
Oh, prima, fixed.

I see red pixels.


Acties:
  • 0 Henk 'm!

  • F4T4L_3RR0R
  • Registratie: September 2005
  • Laatst online: 18-07-2021
Probeer dit:

code:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python

import time
import sys
import subprocess
import os
from datetime import datetime
from dateutil import tz
from lcd2usb import LCD

def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

with open('error.txt','a') as file:
    file.write(('#' * 20) + '\n' + curtime() + '\n')

multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)

try:
    while True:
        line = multimon_ng.stdout.readline()
        multimon_ng.poll()

        if line.__contains__('ALN'):

            if line.startswith('FLEX'):

                flex = line[0:5]
                timestamp = line[6:25]
                melding = line[60:]
                meldinglow = melding.lower()
                capcode = line[45:54]

                utc = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S')
                utc = utc.replace(tzinfo=tz.tzutc())
                local = utc.astimezone(tz.tzlocal())
                local = local.strftime('%d-%m-%Y %H:%M:%S')

                capcode_Steenbergen = capcode == '001200768'
                capcodeToFind = capcode == '001200768' or capcode == '001220499' or capcode == '001420999' 
                meldingToFind = meldinglow == ' a4 ' or meldinglow == ' n275 '
                Uitruk_Steenbergen = False
                lcd = LCD()
                
                print ('Alarm! ' + local + melding + capcode)
                
            if capcodeToFind:
                print 'Code: ' + capcode + ' gevonden in de lijst'
                
                if meldingToFind:
                    print 'Woord match gevonden in lijst'
                    
            if capcode_Steenbergen:
                Uitruk_Steenbergen = True
                
except KeyboardInterrupt:
    os.kill(multimon_ng.pid, 9)
Pagina: 1