[Gelöst] Lookup Table erstellen?

Begonnen von FrauMeier, 02 Januar 2022, 22:55:28

Vorheriges Thema - Nächstes Thema

FrauMeier

Hallo, Ich brauche eine Idee wie ich meinem HTTPMOD je nach status eines Readings unterschieldiche URLs zuordnen kann. Das sollte möglichst übersichtlich sein, also möglichst keine endlose IF abfrage.
Das Reading ist eine Zahl (derzeit von 1-13, wird aber noch mehr), und die URLs sind individuell.
Hat jemand eine Idee wie ich sowas umsetzen kann?

Jamo

#1
Du kannst Dir eine Datenstruktur erstellen, wobei Du jeder Zahl deine URL zuweist, etwa wie folgt:
my %number2UrL = (
  '1'             => 'http://swr-edge-1035-fra-dtag-cdn.cast.addradio.de/swr/swr1/bw/aac/96/stream.aac',
  '2'             => 'http://swr-edge-3032-dus-ts-cdn.cast.addradio.de/swr/swr3/live/aac/96/stream.aac',
  '3'             => 'http://wdr-edge-3012-dus-ts-cdn.cast.addradio.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3',
  .
  .
  '13'             => 'http://wdr-edge-3067-dus-ts-cdn.cast.addradio.de/wdr/wdr5/live/mp3/128/stream.mp3');


Die URL's kannst Du dann wie folgt abholen:my $number = ReadingsNum ($name,$reading,0);
my $url = $number2UrL {$number}

Also $number2UrL {3} liefert dann den entsprechenden URL 'http://wdr-edge-3012-dus-ts-cdn.cast.addradio.de/...' zurück
$name / $reading / etc musst Du natuerlich noch anpassen
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

FrauMeier

Das klingt seht gut. Kannst du mir auch noch sagen wo, bzw wie ich die Datenstruktur anlege? Ist das 99_myUtils, oder als Readings eine Dummy devices?

Jamo

Die wird in der 99_MyUtils.pm oben angelegt, genauso mit dem 'my %number2UrL = ( .....' wie hingeschrieben.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

FrauMeier

Danke Tabelle ist angelegt, aber . das Abholen bekomme ich nicht hin.
my $number = ReadingsNum ($name,$reading,0);
my $url = $number2UrL {$number}

Wenn ich das in die Kommandozeile eigebe gibt es Fehlermeldungen. Muss ich dass definieren, und wenn ja, wie?

Jamo

Ich weiss ja gar nicht, wo deine nummer herkommt, da muesstest Du schon ein list deines devices mit anhaengen.
Du kannst mal probehalber folgendes vollständig kopieren, und dann genau so in die Kommandozeile eintragen:
{my %number2UrL = ('1'  => 'http://swr-edge', '2'=> 'http://swr-3032/stream.aac', '3' => 'http://wdr-edge-stream.mp3', '13'  => 'http://wdr-edge128/stream.mp3');; my $number = 3;; my $url = $number2UrL {$number};; return $url}
Das liefert Dir den URL zur nummer 3 zurueck, also http://wdr-edge-stream.mp3.

Jetzt nehmen wir mal an Du hast einen Dummy 'huhu', mit dem reading 'myNumber', wo die Nummer '3' drin steht, dann kannst Du das so einbauen und benutzen:
{my %number2UrL = ('1'  => 'http://swr-edge', '2'  => 'http://swr-3032/stream.aac', '3' => 'http://wdr-edge-stream.mp3', '13' => 'http://wdr-edge128/stream.mp3');; my $number = ReadingsNum ('huhu','myNumber',0);; my $url = $number2UrL {$number};; return $url}

Zu beachten das in der Kommandozeile die ; verdoppelt werden muessen. Das  habe ich schon gemacht.
Ausserdem ist die Dateistruktur aus der 99_MyUtils.pm in der Kommandozeile so nicht bekannt, deswegen habe ich die oben auch in verkuerzter Form mit eingebaut.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

FrauMeier

List HTTPMOD:
Internals:
   BUSY       0
   CFGFN     
   DEF        %%URL%% 30
   FUUID      61d07553-f33f-bbc1-4ccf-21274b85280a9747
   Interval   30
   MainURL    %%URL%%
   ModuleVersion 4.1.10 - 6.7.2021
   NAME       Radiostream
   NOTIFYDEV  global
   NR         2369
   NTFY_ORDER 50-Radiostream
   STATE      ???
   TYPE       HTTPMOD
   value     
   CompiledRegexes:
   HttpUtils:
     data       
     displayurl
     header     
     httpversion 1.0
     hu_blocking 0
     ignoreredirects 1
     loglevel   4
     redirects  0
     timeout    2
     url       
     sslargs:
   QUEUE:
   READINGS:
     2022-01-01 18:17:49   LAST_REQUEST    update
     2022-01-01 18:17:49   MATCHED_READINGS Title
     2022-01-05 21:40:50   Title           Foo Fighters mit Gimme Stitches
     2022-01-01 18:17:49   UNMATCHED_READINGS
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        %%URL%%
   defptr:
     readingBase:
       Title      reading
     readingNum:
       Title      1
     readingOutdated:
     requestReadings:
       update:
         Title      reading 1
Attributes:
   reading1Name Title
   reading1Regex (?<=\"trackInfo-track">)(.*?)(?=\<)
   replacement01Mode expression
   replacement01Regex %%URL%%
   replacement01Value my $number = ReadingsNum("d_Favoriten","state",0); my $url = number2UrL{2}
   room       Wohnzimmer
   userattr 


Wenn ich ein $ vor das "number2UrL setze bekomme ich die fehlermeldung "invalid expression".

Und hier mein Utils:
##############################################
# $Id: myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub
myUtils_Initialize($$)
{
  my %number2UrL = (
  '1'             => 'http://swr-edge-1035-fra-dtag-cdn.cast.addradio.de/swr/swr1/bw/aac/96/stream.aac',
  '2'             => 'http://swr-edge-3032-dus-ts-cdn.cast.addradio.de/swr/swr3/live/aac/96/stream.aac',
  '3'             => 'http://wdr-edge-3012-dus-ts-cdn.cast.addradio.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3',
  '4'             => 'http://wdr-edge-3067-dus-ts-cdn.cast.addradio.de/wdr/wdr5/live/mp3/128/stream.mp3');
}

# Enter you functions below _this_ line.


1;

Ich sehe den Fehler leider nicht.

Jamo

Erstmal muss die Datenstruktur "my %number2UrL ....." unterhalb der Zeile  #Enter you function beloiw _this_ line.
Deswegen steht das ja auch da, einfach lesen.
So wie Du es gemacht hast, hast Du das in die sub myUtils_Initialize ($$) eingebaut, das kann nicht funktionieren.

Dann darf, soweit ich das gelesen habe, in replacement01Value nur eine perl Funktion stehen, Du hast aber einfach das kopiert, was ich Dir für die Kommandozeile zum ausprobieren geschickt habe, damit Du nachvollziehen kannst, wie es prinzipiell funktioniert.

In welchem HTTPMOD reading steht denn jetzt die Nummer, die Du durch einen URL ersetzen willst?
Ich sehe nur die folgenden Readings, da ist aber nichts von einer Nummer.
READINGS:
     2022-01-01 18:17:49   LAST_REQUEST    update
     2022-01-01 18:17:49   MATCHED_READINGS Title
     2022-01-05 21:40:50   Title           Foo Fighters mit Gimme Stitches
     2022-01-01 18:17:49   UNMATCHED_READINGS

Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

FrauMeier

Ersetzt wird die URL (%%URL%%) und die Nummer steht im Reading eines Dummies "d_Favoriten"
   replacement01Value my $number = ReadingsNum("d_Favoriten","state",0); my $url = number2UrL{2}
Oder muss das im HTTPMOD stehen?
Mit Perl tu ich mich noch etwas schwer.

Jamo

Mit dem replacement value kenne ich mich nicht aus. Da musst Du jemand anderes fragen.
Aber wie ich gelesen habe, muss der replacement01Value eine perlfunktion sein. Deswegen kannst Du erstmal eine perlfunktion definieren, die Dir den URL zurückliefert, also so:sub returnNewURL {
my $number = ReadingsNum("d_Favoriten","state",0);
my url = $number2UrL{$number};
return $url;}
Das ganze (also die gesamte sub returnNewURL {} muss in deine 99_MyUtils.pm unterhalb der Datenstruktur.
Wenn Du nun {returnNewURL()} in die Kommandozeile eingibst, sollte auch die neue URL als Rückgabewert erscheinen, abhängig davon was für eine Nummer in d_farvoriten state steht.

Diese sub muss dann auch in replacement01Value rein, so verstehe ich das, aber da musst Du mal jemanden anders im Forum fragen, vielelicht zum topic HTTPMOD. Damit bin ich hier erstmal raus.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

FrauMeier

Danke! Das Anlegen der Subrutiene war genau der Hinweis der mir gefehlt hat. Jetzt klappt es perfekt!!

Jamo

Gerne, das freut mich wenn ich helfen konnte!
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence