Python Scripting για RPI LCD display κανείς ?

  • Αγαπητοί φίλοι και φίλες.

    Με ιδιαίτερη χαρά σας προσκαλούμε στην κοπή της πρωτοχρονιάτικης πίτας του AVClub στη Θεσσαλονίκη για το 2024 την Κυριακή 07 Απριλίου και ώρα 14.00

    Δηλώστε τη συμμετοχή σας εδώ, θα χαρούμε πολύ να σας γνωρίσουμε από κοντά.

Σταύρος Κ.

Established Member
19 June 2006
215
Υπάρχει μήπως συνforumίτης γνώστης της python , που έχει την διάθεση και τον χρόνο να με βοηθήσει να τροποποιήσω ένα script ?

Ξέρω ακριβώς τι θα ήθελα να πετυχω, αλλά δυστυχώς δεν έχω τις γνώσεις για να το υλοποιήσω.

Ευχαριστώ εκ των προτέρων
Σταύρος
 
Last edited by a moderator:

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Re: Python Scripting κανείς ?

Καλημέρα Σταύρο,

καλό θα ήταν να περιγράψεις τι ακριβώς χρειάζεσαι ώστε να υπάρχει στο νήμα και όποιος μπορεί να προσφέρει τη βοήθειά του. Μπορεί να είναι μια απλή τροποποίηση και να μην απαιτεί τη σοβαρή γνώση python.
 

Σταύρος Κ.

Established Member
19 June 2006
215
Re: Python Scripting κανείς ?

Καλημέρα Μιχάλη,
Έχεις δίκιο άλλα δυσκολεύομαι να το περιγράψω.
Λοιπόν, περιληπτικά :
Ο κώδικας αφορα στην λειτουργία ενός LCD display (16χ2) συνδεδεμένου σε ενα raspberry Pi 2, το οποίο λειτουργεί σαν digital Hi-Fi player με Music Player Daemon.

Υπάρχει ένα συγκεκριμένο script το οποίο προσφέρει info μοιρασμένη σε 6 οθόνες του 16χ2 LCD, οι οποίες εναλλάσσονται από το remote.
Σε μια συγκεκριμένη οθόνη υπάρχει διαφοροποίηση της πληροφορίας που εμφανίζεται αν παίζει Αρχείο ή Ράδιο, αλλά κρατιέται κοινή η πληροφορία που αφόρα την ποιότητα αυτού που παίζεται.

Για αυτή την ποιότητα έχω δοκιμάσει με επιτυχία κώδικα που δίνει τον ρυθμό μετάδοσης (kbps) και κώδικα που δίνει την συχνότητα δειγματοληψίας (kHz).

Το να παραμένει όμως κοινή αυτή η πληροφορία και για τα αρχεία και για το ράδιο δεν έχει νόημα.
Θα ήθελα βοήθεια ωστε να διαφοροποιείται ανάλογα με την πηγή (FILES=kHz & RADIO= kbps)


Επιπρόσθετα θα ήθελα και μερικές άλλες τροποποιήσεις αλλά αυτή είναι η βασική αλλαγή που θέλω να κάνω.

Ελπίζω να βγαίνει νόημα.

Σε κάθε περίπτωση όποιος θελήσει να βοηθήσει ας ρωτήσει τι ακόμη χρειάζεται…

Και πάλι ευχαριστώ !
 

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Re: Python Scripting κανείς ?

Πόσταρε και τον κώδικα!

Edit:

Επίσης πόσταρε και τον κώδικα που λες οτι έχεις δοκιμάσει και δίνει kbbs αντί για khz.
 
Last edited:

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Λοιπόν μίλησα με το Σταύρο και έχω μια πλήρη εικόνα. Κατ' αρχάς, μιλάμε για τον παρακάτω κώδικα:

https://github.com/RandyCupic/RuneAudioLCD/blob/master/display.py


Το κομμάτι που ενδιαφέρει το Σταύρο είναι το εξής:



Code:
# Last line shows RADIO/FILE and bitrate
		if (self.mpd.getData()['type'] == 0):
			word = "FILE"
			
		elif (self.mpd.getData()['type'] == 1):
			word = "RADIO"
		
		# Get bitrate
		bitrate = `self.mpd.getData()['bitrate']` + ' kbps'


Αυτό τσεκάρει με ένα if αν πρόκειται για αρχείο ή streaming και στη συνέχεια βγάζει στην οθόνη τα εξής:


FILE και bitrate σε kbbs (καλώντας το get bitrate)
ή
STREAM και bitrate σε kbbs (καλώντας και πάλι το get bitrate)


Το επιθυμητό αποτέλεσμα θα πρέπει να δείχνει:

FILE και sample rate σε Khz
ή
STREAM και bitrate σε kbbs



Υπάρχει ένας δοκιμασμένος κώδικας ο οποίος δείχνει sampling rate και είναι ο παρακάτω:

Code:
    # Get bitrate ## NEW configuration ->(display kHz)##
            bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
             rate_data = bitratefile_obj.read()
             ratestart = rate_data.find('rate:')+6
             ratestop = rate_data.find('(')-1
             brate = str(rate_data[ratestart:ratestop])
             if brate[-3:] == '000':
                bitrate=brate[:-3]+' kHz'
             elif brate[-2:] == '00':
                  rate=brate[:-2]
                  bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
             elif brate[-1:] == '0':
                  brate=brate[:-1]
                  bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
             else:
                  bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'



Αυτό που εγώ θεωρώ ότι χρειάζεται είναι ένα if στο section #Get bitrate. Για αρχή θα δοκίμαζα το παρακάτω

Code:
# Last line shows RADIO/FILE and bitrate
		if (self.mpd.getData()['type'] == 0):
			word = "FILE"
			
		elif (self.mpd.getData()['type'] == 1):
			word = "RADIO"
		
		# Get bitrate
                if (self.mpd.getData()['type'] == 0):
		      
                      bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
                      rate_data = bitratefile_obj.read()
                      ratestart = rate_data.find('rate:')+6
                      ratestop = rate_data.find('(')-1
                      brate = str(rate_data[ratestart:ratestop])
                      if brate[-3:] == '000':
                      bitrate=brate[:-3]+' kHz'
                      elif brate[-2:] == '00':
                      rate=brate[:-2]
                      bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
                      elif brate[-1:] == '0':
                      brate=brate[:-1]
                      bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
                      else:
                     bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'
               
               elif (self.mpd.getData()['type'] == 1):

                       bitrate = `self.mpd.getData()['bitrate']` + ' kbps'



Αν δουλεύει το παραπάνω, λογικά θα δουλευέι και το παρακάτω στο οποίο έχω ενσωματώσει τα δύο sections σε ένα if:


Code:
# Last line shows RADIO/FILE and bitrate
		if (self.mpd.getData()['type'] == 0):
		      word = "FILE"
                      bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
                      rate_data = bitratefile_obj.read()
                      ratestart = rate_data.find('rate:')+6
                      ratestop = rate_data.find('(')-1
                      brate = str(rate_data[ratestart:ratestop])
                      if brate[-3:] == '000':
                      bitrate=brate[:-3]+' kHz'
                      elif brate[-2:] == '00':
                      rate=brate[:-2]
                      bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
                      elif brate[-1:] == '0':
                      brate=brate[:-1]
                      bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
                      else:
                     bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'
			
		elif (self.mpd.getData()['type'] == 1):
			word = "RADIO"
                        bitrate = `self.mpd.getData()['bitrate']` + ' kbps'
 

Σταύρος Κ.

Established Member
19 June 2006
215
Ευχαριστώ πολύ !
Το βραδάκι θα το δοκιμάσω και θα ενημερώσω για τα αποτελέσματα.
 

Σταύρος Κ.

Established Member
19 June 2006
215
Δυστυχώς τζίφος
Δεν δουλεύει κανένα από τα δυο σενάρια.
Το τροποποιημένο display.py δείχνει να μην διαβάζεται καθόλου και στις δυο περιπτώσεις.
(δεν δημιουργείται καν .pyc αρχείο)
 

Tzimisce

Vampire
Staff member
1 February 2007
32,920
127.0.0.1
Αν κατάλαβα καλά...

Code:
		if (self.mpd.getData()['type'] == 0):
			word = "FILE"
		        bitrateWord = ' Khz'
		elif (self.mpd.getData()['type'] == 1):
			word = "RADIO"
		        bitrateWord = ' kbps'
		
		# Get bitrate
		bitrate = `self.mpd.getData()['bitrate']` + bitrateWord
 

Σταύρος Κ.

Established Member
19 June 2006
215
Ας δώσω ένα οπτικό παράδειγμα :
Όταν παίζω ένα αρχείο, η συγκεκριμένη οθόνη πληροφόρησης δείχνει στην πρώτη γραμμή την πηγή (FILE)και την συχνότητα δειγματοληψίας .
Στην δεύτερη γραμμή δείχνει τον χρόνο του κομματιού που έχει παιχτεί σε σχέση με τον συνολικό χρόνο.
02_a.jpg

Όταν παίζω ράδιο (stream), τότε η συγκεκριμένη οθόνη δείχνει και πάλι την πηγή (RADIO) με την συχνότητα δειγματοληψίας , ενώ στην δεύτερη γραμμή μετρά τον συνολικό χρόνο αναπαραγωγής.
02_b.jpg

Στον αρχικό κώδικα (αυτον του github) και στις δυο οθόνες δεν εμφανίζονταν η συχνότητα δειγματοληψίας αλλά ο ρυθμός μετάδοσης (kbps).
Επειδή όμως με ενδιέφερε κυρίως η αναπαραγωγή αρχείων και εκεί η συχνότητα δειγματοληψίας είναι χρησιμότερη πληροφορία από τον ρυθμό μετάδοσης , βρήκα τον τρόπο να το αλλάξω.
Το θέμα είναι ότι η αλλαγή επηρεάζει ταυτόχρονα και τις δυο οθόνες, ενώ εγώ θα ήθελα να είναι διαφορετική ανά οθόνη.
Δηλαδή να παραμείνει η συχνότητα στα FILES και στην οθόνη του streaming να εμφανίζεται ο ρυθμός μετάδοσης που εκεί έχει όντως νόημα ως πληροφορία.

Είναι κατανοητότερο το τι έχω και το τι θα ήθελα να πετύχω ?
 

Tzimisce

Vampire
Staff member
1 February 2007
32,920
127.0.0.1
Από ότι βλέπω, αν και δεν ασχολούμαι με Python (πέρα από το Robot Framework), από τη βιβλιοθήκη που χρησιμοποιείς, sample rate, μάλλον δεν μπορείς να πάρεις.
Μπορείς να χρησιμοποιήσεις άλλες βιβλιοθήκες;

Η pydub.utils.mediainfo φαίνεται να κάνει τη δουλειά που θέλεις.
 
Μα, υπάρχουν έτοιμα MPD libraries για Python. Γιατί να κάνουμε τη ζωή μας δύσκολη; https://pypi.python.org/pypi/python-mpd2

Απ' ότι θυμάμαι μου είχε πάρει λίγες ώρες για να μάθω όση Python χρειαζόμουν και να γράψω το σκριπτάκι που ήθελα για τη δικιά μου εφαρμογή..

IMG_20160515_033943 (Medium).jpg
 

Σταύρος Κ.

Established Member
19 June 2006
215
Καταρχήν ο κώδικας που χρησιμοποιώ είναι πολύ καλός για τις υπάρχουσες ανάγκες μου και απλώς προσπαθώ να τον κάνω καλύτερο στα πλαίσια του δικού μου ψυχαναγκασμού:nounder:.
Δεν νομίζω να κατάφερνα να φτιάξω κάτι ανάλογο ξεκινώντας από το μηδέν.
Σε ότι αφορά την πληροφορία αυτή καθεαυτή, έχω ήδη το αρχικό κομμάτι του κώδικα που δουλεύει και δείχνει τον ρυθμό μεταφοράς , και ένα άλλο κομμάτι κώδικα που και αυτό δουλεύει σωστά και δείχνει την συχνότητα δειγματοληψίας.
Οι οθόνες που επισύναψα είναι με τον κώδικα τροποποιημένο από μένα να δείχνει sample rate.
Το πρόβλημα μου είναι ότι στον υπάρχοντα κώδικα μπορώ μόνο να έχω ενα απο τα δυο κομμάτια του κώδικα, με αποτέλεσμα να παίρνω πάντα την ίδια πληροφορία (είτε kHz, είτε kbps – ότι έχω προαποφασίσει) για κάθε τύπο πηγής.
Εγώ θα ήθελα ιδανικά να ενσωματώσω και τα δυο κομμάτια στον κώδικα με τρόπο τέτοιο που να χρησιμοποιείται το καθένα ανάλογα με την πηγή που παίζει (type 0=kHz / type 1= kbps).
Αυτό προσπάθησε ο αγαπητός Tuxx να πετύχει με τα δυο σενάρια του, αλλά κανένα από αυτά δεν μου δούλεψε.
Δεν είμαι σχετικός αλλά έχω την εντύπωση ότι το τροποποιημένο script δεν «διαβάστηκε» καθόλου, οπότε ίσως η τροποποίηση επιφέρει κάποιο λογικό σφάλμα είτε εγώ τροποποιώντας τα κάνω κάποια πατάτα.
Από πλευράς μου έχω στερέψει από ιδέες για δοκιμές.
Αν κάποιος από σας θέλει και μπορεί, ας προτείνει κάποιο διαφορετικό σενάριο (τροποποίηση) να δοκιμάσω.
Το link του GitHub με τον αρχικό κώδικα το έχει ήδη postάρει ο Tuxx πιο πάνω, μαζί με το κομμάτι του κώδικα που δείχνει το sample rate.
Στον αρχικό κώδικα η συγκεκριμένη οθόνη περιγράφεται από την γραμμή 588 έως την 720.

Την καλημέρα μου
Σταύρος
 
Last edited:

papdoux

Supreme Member
14 December 2007
3,403
δώσε στη γραμμή python display.py και θα σου πει ακριβώς σε ποια γραμμή είναι το λάθος και τι λάθος έχει.

Επίσης ο τροποποιημένος κώδικα υπάρχει κάπου να δούμε τι έχεις κάνει;
 

Tzimisce

Vampire
Staff member
1 February 2007
32,920
127.0.0.1
Το πάμε στα ψαχουλευτά.

blind coding. :p

Ο κώδικας αυτός σου επιστρέφει αυτό που θέλεις;

Code:
    # Get bitrate ## NEW configuration ->(display kHz)##
            bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
             rate_data = bitratefile_obj.read()
             ratestart = rate_data.find('rate:')+6
             ratestop = rate_data.find('(')-1
             brate = str(rate_data[ratestart:ratestop])
             if brate[-3:] == '000':
                bitrate=brate[:-3]+' kHz'
             elif brate[-2:] == '00':
                  rate=brate[:-2]
                  bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
             elif brate[-1:] == '0':
                  brate=brate[:-1]
                  bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
             else:
                  bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'

Αν ναι, τότε το if statement που ελέγχει αν είναι file ή radio θα πρέπει να διαμορφωθεί ως εξής:
Code:
        # Last line shows RADIO/FILE and bitrate
        if (self.mpd.getData()['type'] == 0):
            word = "FILE"
            bitrate = `self.mpd.getData()['bitrate']` + ' kbps'

        elif (self.mpd.getData()['type'] == 1):
            word = "RADIO"
            bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params', 'r')
            rate_data = bitratefile_obj.read()
            ratestart = rate_data.find('rate:') + 6
            ratestop = rate_data.find('(') - 1
            brate = str(rate_data[ratestart:ratestop])
            if brate[-3:] == '000':
                bitrate = brate[:-3] + ' kHz'
            elif brate[-2:] == '00':
                rate = brate[:-2]
                bitrate = brate[:-1] + '.' + brate[-1:] + ' kHz'
            elif brate[-1:] == '0':
                brate = brate[:-1]
                bitrate = brate[:-2] + '.' + brate[-2:] + ' kHz'
            else:
                bitrate = brate[:-3] + '.' + brate[-3:] + ' kHz'


Αν όχι, κάτι δεν κατάλαβα καλά πάλι και πρέπει να το κάνεις τάλαρα. :p
Βάλε μόνο τον κώδικα στον οποίο αναφέρεσαι για να μην ψάχνουμε 1100 γραμμές και γράψε το output που παίρνεις και το output που θα ήθελες να πάρεις.
Πλάκα έχει η Python αλλά αν δεν έχεις συνηθίσει το identation της κλάψε τα Χαράλαμπε.
 

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Μιχάλη,

ναι το το σετάκι του κώδικα που βρήκε ο Σταύρος δουλευεί. Θέλει ακριβώς το ανάποδο από αυτό που έκανες, δηλαδή if type 0 τοτε κωδικας KHZ, elif type 1 τότε kbps και γι αυτό του είχα ποστάρει αυτό:
Code:
# Last line shows RADIO/FILE and bitrate
        if (self.mpd.getData()['type'] == 0):
              word = "FILE"
                      bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
                      rate_data = bitratefile_obj.read()
                      ratestart = rate_data.find('rate:')+6
                      ratestop = rate_data.find('(')-1
                      brate = str(rate_data[ratestart:ratestop])
                      if brate[-3:] == '000':
                      bitrate=brate[:-3]+' kHz'
                      elif brate[-2:] == '00':
                      rate=brate[:-2]
                      bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
                      elif brate[-1:] == '0':
                      brate=brate[:-1]
                      bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
                      else:
                     bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'
            
        elif (self.mpd.getData()['type'] == 1):
            word = "RADIO"
                        bitrate = `self.mpd.getData()['bitrate']` + ' kbps'


Αλλά λέει ότι δεν του δούλεψε
 

Tzimisce

Vampire
Staff member
1 February 2007
32,920
127.0.0.1
Code:
        # Last line shows RADIO/FILE and bitrate
        if (self.mpd.getData()['type'] == 0):
            word = "FILE"
            bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params', 'r')
            rate_data = bitratefile_obj.read()
            ratestart = rate_data.find('rate:') + 6
            ratestop = rate_data.find('(') - 1
            brate = str(rate_data[ratestart:ratestop])
            if brate[-3:] == '000':
                bitrate = brate[:-3] + ' kHz'
            elif brate[-2:] == '00':
                rate = brate[:-2]
                bitrate = brate[:-1] + '.' + brate[-1:] + ' kHz'
            elif brate[-1:] == '0':
                brate = brate[:-1]
                bitrate = brate[:-2] + '.' + brate[-2:] + ' kHz'
            else:
                bitrate = brate[:-3] + '.' + brate[-3:] + ' kHz'

        elif (self.mpd.getData()['type'] == 1):
            word = "RADIO"
            bitrate = `self.mpd.getData()['bitrate']` + ' kbps'
Ε, άρα αυτό.
Θέλει ΠΟΛΥ προσοχή στα κενά και τα tabs!
 

papdoux

Supreme Member
14 December 2007
3,403
Απάντηση: Re: Python Scripting για RPI LCD display κανείς ?

Μιχάλη,

ναι το το σετάκι του κώδικα που βρήκε ο Σταύρος δουλευεί. Θέλει ακριβώς το ανάποδο από αυτό που έκανες, δηλαδή if type 0 τοτε κωδικας KHZ, elif type 1 τότε kbps και γι αυτό του είχα ποστάρει αυτό:
Code:
# Last line shows RADIO/FILE and bitrate
        if (self.mpd.getData()['type'] == 0):
              word = "FILE"
                      bitratefile_obj = open('/proc/asound/card1/pcm0p/sub0/hw_params','r')
                      rate_data = bitratefile_obj.read()
                      ratestart = rate_data.find('rate:')+6
                      ratestop = rate_data.find('(')-1
                      brate = str(rate_data[ratestart:ratestop])
                      if brate[-3:] == '000':
                      bitrate=brate[:-3]+' kHz'
                      elif brate[-2:] == '00':
                      rate=brate[:-2]
                      bitrate=brate[:-1]+'.'+brate[-1:]+' kHz'
                      elif brate[-1:] == '0':
                      brate=brate[:-1]
                      bitrate=brate[:-2]+'.'+brate[-2:]+' kHz'
                      else:
                     bitrate = brate[:-3]+'.'+brate[-3:]+' kHz'
            
        elif (self.mpd.getData()['type'] == 1):
            word = "RADIO"
                        bitrate = `self.mpd.getData()['bitrate']` + ' kbps'


Αλλά λέει ότι δεν του δούλεψε

Αν έκανε copy/paste τον κώδικα όπως το γράφεις τότε χτυπάει λόγω indentation. Ο Tzimisce έχει σωστό indentation. Η python είναι ευαίσθητη με τα κενά και τα tabs. Η ανάμιξη των δύο χτυπάει error
 

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Δεν έχω ιδέα ούτε από python, ούτε από coding εν γένει και ως εκ τούτου δεν γνώριζα όσα λέτε.:grandpa:

Εφόσον ο Μιχάλης το ίσιωσε, δεν έχει λόγο να μην παίξει τώρα πιστεύω.
 

Σταύρος Κ.

Established Member
19 June 2006
215
Κύριοι,
Καταρχήν σας ευχαριστώ Ολους σας για την βοήθεια, αλλα να σας επισημάνω ότι μιλάτε με έναν άσχετο που λέξεις όπως «indentation» τις googlάρει και πάλι δεν καταλαβαίνει τι σημαίνουν.

Sorry γι´ αυτό.:nounder:

Λοιπόν, μάλιστα τροποποίησα το script με copy paste και ναι το scrip δείχνει εφεξης να μην «διαβάζεται» καθόλου.

Ζητώ την επιείκεια σας και σας ρωτώ:
Υπάρχει foolproof τρόπος να το κάνω ?

Σε κάθε περίπτωση το βραδάκι θα δοκιμάσω το σενάριο του Tzimisce

ευχαριστω
Σταυρος