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?
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
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?
Die wird in der 99_MyUtils.pm oben angelegt, genauso mit dem 'my %number2UrL = ( .....' wie hingeschrieben.
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?
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.
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.
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
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.
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.
Danke! Das Anlegen der Subrutiene war genau der Hinweis der mir gefehlt hat. Jetzt klappt es perfekt!!
Gerne, das freut mich wenn ich helfen konnte!