Bitte um Programmierhilfe

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Bitte um Programmierhilfe

      Hallo Leute,

      ich habe vor wenigen Tagen mit python angefangen und schreibe mir gerade ein kleines Plug in.
      Das Plugin soll die aktuellen Aufnahmen einblenden. Das klappt auch soweit ganz gut.
      Nun würde ich gerne an einer Stelle noch die Satposition und den Provider anzeigen.
      Aus dem Recordtimer erhalte ich ja die Servicereference.
      Leider habe ich jetzt zweit Tage vergeblich damit verbracht, wie ich aus dieser Reference die gewünschten Daten erhalte.
      Natürlich könnte ich das alles selber machen aber es gibt bestimmt Aufrufe im System die das alles schon können.

      Wie also erhalte ich aus einem ServiceReferenceString meine gewünschten Daten ?
      Ich bin sicher hier sind genügend Leute die mir helfen können.

      Vielen Dank schon mal
    • Vom Prinzip her so:

      Quellcode

      1. from enigma import eServiceCenter, iServiceInformation
      2. #from RecordTimer import RecordTimerEntry
      3. #timer = RecordTimerEntry()
      4. serviceHandler = eServiceCenter.getInstance()
      5. serviceInfo = serviceHandler.info(timer.service_ref.ref)
      6. serviceInfo = serviceInfo and serviceInfo.getInfoObject(timer.service_ref.ref, iServiceInformation.sTransponderData)
      7. print "#######################serviceInfo: ",serviceInfo
    • Hi pzy-co,

      habe die Zeilen bis auf print mal eingebaut. Zumindest stürzt das Proggi nicht ab. Scheint also der richtige Weg zu sein.
      Vielen Dank schon mal dafür.
      Das print bringt mir zu dem Zeitpunkt nichts weil ich keine console habe darum wollte ich folgendes machen:

      if serviceInfo:
      txtInfo = transponder_info["tuner_type"]

      Das klappt auch. Bekomme als Ergebnis "DVB-S". Das mit dem "tuner_type" habe ich durch Zufall gefunden. Das ich dort auch die "orbital_position" erhalte habe ich auch gesehen.
      Wie aber komme ich an den Namen des Satelliten bzw. an den Provider ?
      Bin aber schon echt happy das es funktioniert. Leider habe ich keinerlei Infos was alles in serviceInfo zu finden ist.
      Bitte denke daran, dass ich erst seit wenigen Tagen python mache und mich mit enigma erst recht nicht auskenne. Ich mache hauptsächlich C bzw. C++ .unter Windows.
      Für mich ist python also eine absolute Chaossprache, da ich sonst extrem auf Strukturen und Datenformate zu achten habe.

      Vielen Dank
    • Die Satellitenanzeige habe ich jetzt fertig. Musste zwar doch vieles selber machen, aber ohne deine Hilfe hätte ich noch Wochen gesucht.
      Der wichtigste Hinweis war für mich, dass die Reference im Timer so timer.service_ref.ref und nicht so timer.service_ref angesprochen wird.
      Woher soll man das alles wissen wenn man keinerlei Information hat. Wenigstens Strukturbeschreibungen oder so etwas.

      Als Beispiel zwei Probeaufnahmen
    • Ist das nicht das selbe was auch das Plugin InfoBarTunerState macht ?
      Wobei ich zugeben muss das deines Eleganter aussieht D:
      Habe das gerade erst bei mir entfernt (war mir persönlich zu viel Einblendung)
      Skins: Uno4K = LinearFHD / Zero = IflatFHD
      Vodafone BW V23 Karte (Premium Paket + HD Option) mit Oscam über den BoxPirates Cam Manager
      Richtige Benennung von Filme und Serien für Emby ,Plex oder Kodi ? ...mit dem Tool FileBot schnell erledigt
    • So ein Plugin ist doch immer viel schöner, wenn man es selbst hin bekommen hat.
      Außerdem ist so ein Projekt ja auch lehrreich.

      Dir fehlt wohl lediglich der Einstieg, um dich in den python-Objekten zurecht zu finden, programmieren kannst du ja schon.

      Eine Konsole hast du immer, wenn du enigma im 'init 4' über telnet startest.
      Alle 'print'-Ausgaben gehen auf diese Konsole, lassen sich aber auch in eine Datei umleiten, bei Bedarf.
      Da bekommst du schon mal den Inhalt der Objekte angezeigt, oder wenigstens Objekttyp/Klasse genannt.
      Für die Struktur des Objektes muss man sich dann die entsprechende Klasse ansehen.
      Wo der Code zu finden ist, wird ja über den import angezeigt, relativ zu dem Pfad:
      /usr/lib/enigma2/python/

      Alternativ findet man die Klasse mit einer Textsuche des genannten Objektes ab dem oben genannten Pfad.

      Die Klasse RecordTimerEntry (from RecordTimer import RecordTimerEntry) ist also in:
      /usr/lib/enigma2/python/RecordTimer.py

      Dort sieht man dann, daß 'self.service_ref' auf ein Objekt vom Typ 'ServiceReference' verweist.

      Im Objekt der Klasse 'ServiceReference' wird die eigentliche 'eServiceReference' auf 'self.ref' hinterlegt.
      Mit 'RecordTimerEntry.service_ref.ref' kommst du also an die ''eServiceReference'.
      Was man mit diesem Objekt alles anfangen könnte, ist in der enigma.py hinterlegt, wenn man wieder dem 'import' folgt.
      So kommt man dann an die benötigten Strukturen/Variablen/Methoden, oder den Objekt-/Datentyp eines Parameters, den man übergeben muß, wenn man andere Objekte benutzen möchte.

      Ist natürlich erstmal chaotisch, wenn man gerade erst angefangen hat.
      Einfacher ist eine IDE, kurz klicken und man ist im Code der entsprechenden Klasse und kann sich den Aufbau betrachten.

      So, viel geschrieben, hoffe das schafft dir etwas mehr Überblick wie du verfahren kannst, um die Strukturen selbst herauszufinden.
      Wenn du gar keinen Ansatz zum Starten hast, dann suchst du dir ein Plugin, daß die gewünschten Daten darstellt und folgst den dort benutzten Objekten über den jeweiligen 'import'.
      Diese Objekte kannst du dann in deinem Plugin auf die gleiche Weise nutzen um Daten zu erhalten.

      Aber für wenige Tage Erfahrung mit python ist das doch schon eine Hammer-Leistung, was du dir da gebastelt hast, der Rest kommt mit der Routine.


      Gruß
      pzy-co
    • Vielen Dank für die vielen guten Tipps.
      Natürlich bin ich genauso vorgegangen. Sehr viel mit der Textsuche und natürlich auch im Netz recherchiert.
      Das mit der Ausgabe in eine Datei habe ich allerdings erst gerade angefangen. Meine aktuelle Lösung für den Provider funktioniert zwar, ist aber totaler Unsinn weil es das System zu sehr belastet.

      Quellcode

      1. def readProviders(self,refstr=None):
      2. serviceHandler = eServiceCenter.getInstance()
      3. servlist = serviceHandler.list(eServiceReference('1:0:19:6EA5:4B1:1:C00000:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) FROM PROVIDERS ORDER BY name'))
      4. providers = servlist and servlist.getContent("SN", True)
      5. for prov in providers:
      6. services = serviceHandler.list(eServiceReference(prov[0]))
      7. list = services and services.getContent("SN", True)
      8. for service in list:
      9. if refstr and service[0] == refstr:
      10. return prov[1]
      11. return ""
      Alles anzeigen



      Ich hole mir einfach alle Provider und anschließend pro Provider die Services. Dabei vergleiche ich einfach die Strings bis es passt. Persönlich graut es mir bei dieser Lösung weil:
      1. Muss das System die Daten ja eh irgendwo haben
      2. Schluckt die Routine enorm Ressourcen und Rechenzeit.

      Als Probe und um den Umgang mit den Listen zu üben geht es aber.
      Die falsche Servicereference war Absicht in der Hoffnung, dass ich dann sofort den richtigen Provider erhalte. War aber ein Fehlanzeige. Bekomme auch damit alle Provider.
      Kein anderer Systemaufruf hat mich bisher zu der Lösung mit dem Provider geführt.
      Wenn ich da keine Lösung finde werde ich es ohne Provider anzeigen. Meine Routine darf so nicht ins System. ;_(
      Selbst für die Satelliten musste ich die satellites.xml einlesen und scannen. Ist aber nicht tragisch, weil es nur einmal in eine Liste gespeichert wird und nicht so groß ist.

      PS:
      Das mit dem Programmieren mache ich ja auch schon über 30 Jahre in vielen verschiedenen Sprachen. Dadurch etwas einfacher in eine Neue rein zu finden.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von vudplusream ()

    • 'iServiceInformation.sProvider' solle diese Daten einfacher liefern.
      /usr/lib/enigma2/python/Screens/ServiceInfo.py verwendet das. Der Konverter 'ServiceName' ebenfalls.

      Also "Menü/Informationen/Kanal", wenn du dir den Screen dazu ansehen möchtest.

      Kommt aber auf die Schnelle nichts verwertbares mit der Timer.ref.
      Ist eigentlich fast gleich, wie bei den Transponderdaten, da ging es problemlos.

      Da würde ich mal weiter forschen, kann nicht mehr viel sein, damit es funktioniert.
    • Vielen Dank, aber genau da forsche ich schon seit zwei bis drei Tagen rum.
      Es scheint irgendwelche Unterschiede zu geben. Habe auch ein Proggi Namens ExtendedServiceInfo.py gefunden.
      Dort habe ich auch die Sache mit der Orbitalfunktion gefunden um die Satellitennamen zu finden.
      Hilft aber alles nichts.
      Ich werde wohl bei meiner Lösung bleiben müssen.
      Zur Zeit arbeite ich an der Idee, nur voreingestellte Provider zu suchen. Das geht bisher ganz gut und ist auch recht schnell.

      Quellcode

      1. self.prov_list.append("ARD")
      2. self.prov_list.append("SKY")
      3. self.prov_list.append("UMKBW")
      4. self.prov_list.append("ZDFvision")
      5. self.prov_list.append("ORF")
      6. self.prov_list.append("Schweizer Radio und Fernsehen")

      Wie gesagt, es ist die gleiche Routine wie oben schon beschrieben. Sie fragt halt nur die bestimmten Provider ab. Wenn ein Eintrag gefunden wurde speichere ich ihn in einer zweiten Liste.
      list [(ref,provider)]

      Beim nächsten Aufruf durchsucht er erst die 2. Liste und ist damit noch schneller.
      Vielleicht speichere ich diese Daten auch noch, damit er sie bei nächsten Neustart sofort hat.
      Ich glaube kaum, dass man von allen Providern, noch nicht mal von den Voreingestellten von allen Sendern was aufnimmt.
      Naja, das ist meine bisherig Lösung.


      Nachtrag:
      Besser wäre wenn ich list [(ref,provider.idx)] speichern würde. Spart enorm Speicherplatz. Also nur die Indexnummer aus der anderen Liste.

      So nun habe ich alles noch einmal überarbeitet und werde gleich ins Bett gehen.

      Quellcode

      1. def readProviders(self,refstr=None):
      2. if refstr:
      3. for sref in self.prov_save:
      4. if sref[0] == refstr:
      5. return self.prov_list[sref[1]] # aus zweiter Liste geht schneller
      6. # hier neu suchen
      7. serviceHandler = eServiceCenter.getInstance()
      8. servlist = serviceHandler.list(eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) FROM PROVIDERS ORDER BY name'))
      9. providers = servlist and servlist.getContent("SN", True)
      10. for prov in providers:
      11. if prov[1] in self.prov_list:
      12. services = serviceHandler.list(eServiceReference(prov[0]))
      13. list = services and services.getContent("SN", True)
      14. for service in list:
      15. if refstr and service[0] == refstr:
      16. # gefundenen Eintrag in prov_save sichern [ref,prof]
      17. self.prov_save.append((service[0],self.prov_list.index(prov[1])))
      18. return prov[1]
      19. return ""
      Alles anzeigen


      Mit Hilfe der voreingestellten Provider und dem Zwischenspeichern ist das super schnell.
      Vielleicht findet ja jemand oder pzy-co noch eine andere Lösung.

      Noch ein Nachtrag:
      Der Hinweis mit init 4 war echt super.
      Danke vielmals

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von vudplusream ()

    • Hi,
      habe gerade das Plugin zum ersten mal auf die VU kopiert.
      Leider gab es einen Totalabsturz.
      Ursache waren die Grafiken mit 16M. Wenn ich alles in 256 Farben wandel, läuft alles perfekt.
      Es ist mir schon bei meinem ersten Plugin aufgefallen, dass mein Icon nicht angezeigt wurde. Erst als ich es in 256 Farben gewandelt habe klappte es.
      Wo liegt die Ursache, dass ich auf der VU keine vernünftigen Grafiken darstellen kann ?
      Hoffe es weiß jemand einen Rat.

      Nachtrag:
      Hat sich erledigt. Hatte die Grafiken mit Photostudio 5.5 gespeichert. Ist wohl ein wenig zu alt. Habe sie nun noch einmal mit paint gespeichert und schon funktionieren sie auch auf der VU.
      Komisch nur, dass auf der Dream alles funktioniert hat.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von vudplusream ()

    • So mein Plugin ist jetzt wohl fertig. Hier mal ein Demobildschirm.



      Die permanente Uhr oben rechts ist ein kleines Abfallprodukt was ich noch zusätzlich mit eingebaut habe.
      Sie kann in allen vier Ecken stehen oder einfach AUS.
      Der Skin der Timeranzeige kann extern geändert werden und ist nicht Programmbestandteil.

      Gruß vudplusream