fs20irb Sender und Lautstärke per HTTPMOD auslesen --> gelöst

Begonnen von ckaytwo, 11 Juni 2015, 21:20:28

Vorheriges Thema - Nächstes Thema

ckaytwo

Hallo zusammen,

glücklicherweise konnte ich dank der umfangreichen Dokumentationen im Internet rund um fhem schon so einiges "selbstständig" auf die Beine stellen.
So laufen auf meinem Raspberry mittlerweile einige 1-Wire Sensoren, HM-Devises und auch Funksteckdosen auf 433MHz schalten zuverlässig.

Mein neuestes Projekt ist die Steuerung des fs20irb Internetradio per HTTP. Die Steuerung klappt auch sehr zuverlässig über curl befehle. (http://maximilian-roth.de/?p=413)

Bei der Erfassung des aktuellen Senders stoße ich jedoch an meine Grenze. Das Beispiel für die Benzinpreiserfassung aus dem Wiki per HTTPMOD brachte bei mir zwar nicht den aktuellen Preis, aber wenigstens wurden Daten angezeigt so dass ich die Generelle Funktion des Moduls als getestet betrachte. Das Netzwerk habe ich auch bereits bis auf die Fritzbox reduziert. (ein als Switch missbrauchter Router war die erste vermutete Fehlerquelle)

Mein Misserfolg in Fhem:

define radio HTTPMOD http://radio/index.htm 10
attr radio readingsName_Sender Sender
attr radio readingsRegex_Sender Webradiosender:</td>\n     <td>.*?>


Den Regex habe ich versucht mir durch Informationen aus dem Internet zusammenzubauen und habe ihn auf http://www.regexr.com/ getestet.

Mir fehlt aktuell der richtige Ansatz.
Das Radiointerface benötigt keinen Login.


Quelltext:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 STRICT//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Internetradio FS20 IRB</title>
  <link rel="stylesheet" href="style.css" type="text/css" />
  <link rel="icon" href="audio.png" />
  <meta http-equiv="refresh" content="10; URL=index.htm" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
  <p class="logo"><a href="http://www.elv.de"><img src="logo.png" alt="Logo" /></a> <a href="index.htm">Internetradio FS20 IRB</a> | <a href="config.htm">Konfiguration</a> | <a href="stations.htm">Sender</a></p>
  <p>Willkommen auf der Informationsoberfl&auml;che Ihres Internetradios FS20 IRB.</p>
  <p>Bitte verwenden Sie zur Inbetriebnahme dieses Ger&auml;tes die <a href="config.htm">Konfigurationsoberfl&auml;che</a>.</p>
  <form method="post" action="index.htm">
   <table>
    <tr>
     <td class="title"><img src="audio.png" alt="Audio" /> Toneinstellungen:</td>
     <td></td>
    </tr>
    <tr>
     <td>Lautst&auml;rke:</td>
     <td>34 %</td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnVolumeDown" type="submit" value="Leiser" /> <input name="btnVolumeUp" type="submit" value="Lauter" /></td>
    </tr>
    <tr>
     <td>Bass-Boost:</td>
     <td>60 %</td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnBassBoostDown" type="submit" value="Weniger" /> <input name="btnBassBoostUp" type="submit" value="Mehr" /></td>
    </tr>
    <tr>
     <td>H&ouml;hen:</td>
     <td>53 %</td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnTrebleDown" type="submit" value="Weniger" /> <input name="btnTrebleUp" type="submit" value="Mehr" /></td>
    </tr>
    <tr>
     <td>Verst&auml;rker:</td>
     <td><input name="btnAmplifierSwitch" type="submit" value="Ausschalten" /></td>
    </tr>
    <tr>
     <td></td>
     <td>&nbsp;</td>
    </tr>
    <tr>
     <td class="title"><img src="station.png" alt="Webradiosender" /> Webradiosender:</td>
     <td></td>
    </tr>
    <tr>
     <td>Abspielmodus:</td>
     <td>Internetradio</td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnPlayerModePrev" type="submit" value="Vorheriger" /> <input name="btnPlayerModeNext" type="submit" value="N&auml;chster" /></td>
    </tr>
    <tr>
     <td>Webradiosender:</td>
     <td>Antenne Niederrhein</td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnStationPrev" type="submit" value="Vorheriger" /> <input name="btnStationNext" type="submit" value="N&auml;chster" /></td>
    </tr>
    <tr>
     <td></td>
     <td><a href="stations.htm">Sender verwalten...</a></td>
    </tr>
    <tr>
     <td>Senderinformationen:</td>
     <td><input name="btnMetaDataSwitch" type="submit" value="Ausschalten" /></td>
    </tr>
    <tr>
     <td>Adresse:</td>
     <td>http://edge.live.mp3.mdn.newmedia.nacamar.net/ps-antennenr/livestream.mp3</td>
    </tr>
    <tr>
     <td>Sender:</td>
     <td>Antenne Niederrhein mp3 </td>
    </tr>
    <tr>
     <td>Aktueller Song:</td>
     <td></td>
    </tr>
    <tr>
     <td></td>
     <td><input name="btnStationStart" type="submit" value="Starten" /> <input name="btnStationStop" type="submit" value="Stoppen" /></td>
    </tr>
    <tr>
     <td></td>
     <td>&nbsp;</td>
    </tr>
   </table>
  </form>
  <p class="logo">&copy; 2011 ELV Elektronik AG</p>
</body>
</html>



Ich hoffe mir kann jemand weiterhelfen. Ich kann leider nur meine bisherige Lösung für die Steuerung des Radios anbieten (die ja auch von Maximilian Roth abgekupfert ist):
Ich habe nur einen Funkwansschalter und benötige bisher nur on, off, volup, voldown.

Einen Dummy raSteuerung anzulegen traue ich allen hier zu.
Darauf reagiert dann nur noch ein notify. On und Off schaltet die Funksteckdose, nicht den integrierten Verstärker.


raSteuerung {
my $r1 =$value{raSteuerung};;

if($r1 eq "on"){system("sudo /usr/bin/send 11111 01101 1&")}
elsif($r1 eq "off") {system("sudo /usr/bin/send 11111 01101 0&")}
elsif($r1 eq "next") {system("curl --data-urlencode btnStationNext=0 http://192.168.178.35/index.htm")}
elsif($r1 eq "prev") {system("curl --data-urlencode btnStationPrev=0 http://192.168.178.35/index.htm")}
elsif($r1 eq "down") {system("curl --data-urlencode btnVolumeDown=0 http://192.168.178.35/index.htm")}
elsif($r1 eq "up") {system("curl --data-urlencode btnVolumeUp=0 http://192.168.178.35/index.htm")}
}


Ich hoffe bis bald.

Christian

ckaytwo

Ich habs geschafft!! zwar noch nicht verstanden, aber es funktioniert.

Die Steuerung erfolgt über up,down,prev und next über curl Befehle wie oben beschrieben.
Die Anzeige der Lautstärke und des Senders erfolgt über HTTPMOD.
Alles zusammen ist im Raum Radio.


define radioSender HTTPMOD http://192.168.178.35/index.htm 10
attr radioSender readingsName1 Sender
attr radioSender readingsRegex1 (?s).*?>Abspielmodus:<.*?>Webradiosender:<.*?<td>([\w\s\w]+)
attr radioSender stateFormat {sprintf("%20.20s", ReadingsVal($name,"Sender","Aus"))}



define radioLautstaerke HTTPMOD http://192.168.178.35/index.htm 10
attr radioLautstaerke readingsName1 Lautstaerke
attr radioLautstaerke readingsRegex1 (?s).*?>Lautst&auml;;rke:<.*?<td>(\d?\d)
attr radioLautstaerke stateFormat {sprintf("%s", ReadingsVal($name,"Lautstaerke","Aus"))}


Da ich mir die Zähne daran ausgebissen habe, möchte ich versuchen zu Erklären wie ich zu der Lösung gekommen bin.

Ohne folgende Seiten geht nichts.
http://php.net/manual/de/function.sprintf.php
http://regexr.com/

Sobald die Attribute readingsName1 und readingsRegex1 gesetzt sind, sollten eine menge Daten in den Internals buf auftauchen.
Zunächst muss mit dem readingsRegex der Bereich ausgewählt werden, in dem die zu lesende Info steht.

Lese auch nach Zeilenumbrüchen: (?s)
Lese alles: .*?
Bis: >Lautst&auml;;rke:<
Lese alles: .*?
Bis: <td>
In runden Klammern wird angegeben was im nächsten Schritt verarbeitet werden kann. In diesem Fall drei Zeichen von 0-9: (\d?\d)

Damit die Lautstärke auch als State angezeigt wird, bedarf es dem stateFormat mit der formatierungsfunktion sprintf.
Einen Integer anzeigen: "%s"

Analog dazu wird der Sender gesucht. Da das Wort "Webradiosender" häufiger vorkommt suchen wir erst den Abspielmodus: (?s).*?>Abspielmodus:<
Lesen alles: .*?
Bis: >Webradiosender:<
Lesen alles: .*?
bis:<td>
Und merken uns die nächsten Wörter inklusive Leerzeichen: ([\w\s\w]+)

Da es diesmal ein String ist, muss dies auch angegeben werden. "%20.20s" gibt einen String mit maximal 20 Zeichen aus.

Die Erläuterungen habe ich mir durch Lesen, try and error und logischen Schlussfolgerungen zusammengedichtet. Ich bin sicher, das die Erklärungen nicht korrekt erklärt sind und wenn mir jemand hilft würde ich das gerne korrigieren. (und verstehen)

Abschließend sei noch davor gewarnt, das Radio mit einer Funksteckdose wie bei mir vom Strom zu trennen. Sobald das Radio aus ist, hängt sich fhem auf. Ein einfaches Timeout reicht noch nicht. Ich bin noch am forschen.

Was noch fehlt:
Einstellen einer definierten Lautstärke.
40 mal einen Befehl senden vorm ausschalten, belastet den raspberry zu stark und ist nicht zuverlässig. Ich fürchte, das auch eine Schleife (ist-soll Vergleich) zu lange Laufzeiten hat.

Abfrage nur nach einer Bedieneingabe durchführen um die Performance weiter zu optimieren.

Rückmeldungen wären schön, ich habe noch ein paar Wissenslücken zu stopfen.

Viel Spass...

Christian


ckaytwo

... und jetzt ist auch das Letzte Problem gelöst.

Damit die Http-Abfragen nur bei bedarf laufen:

attr radioSender disable 1
attr radioSender get1Name Sender

Mit get radioSender Sender wird jetzt die Abfrage gemacht.

Meine Steuerung habe ich jetzt erweitert:

raSteuerung {
my $r1 =$value{raSteuerung};;

if($r1 eq "on"){system("sudo /usr/bin/send 11111 01000 1&")}
elsif($r1 eq "off"){system("sudo /usr/bin/send 11111 01000 0&")}

elsif($r1 eq "next") {system("curl --data-urlencode btnStationNext=0 http://192.168.178.35/index.htm");;fhem "get radioSender Sender"}
elsif($r1 eq "prev") {system("curl --data-urlencode btnStationPrev=0 http://192.168.178.35/index.htm");;fhem "get radioSender Sender"}
elsif($r1 eq "down") {system("curl --data-urlencode btnVolumeDown=0 http://192.168.178.35/index.htm");;fhem "get radioLautstaerke Lautstaerke"}
elsif($r1 eq "up") {system("curl --data-urlencode btnVolumeUp=0 http://192.168.178.35/index.htm");;fhem "get radioLautstaerke Lautstaerke"}

}


Ich bin sehr begeistert, die Antwort erscheint quasi in Echtzeit......



hackepeter

Hallo,

super Arbeit, die Implementierung aus Post 2 hat bei mir auf anhieb funktioniert.
Allerdings hängt mein Radio auch an ner Funksteckdose.

Meine Frage: Wie muss das Script implementiert werden?

Gruß, Oli