Hallo,
Wie kann ich denn einen textbasierenden RSS Feed erstellen, der vom FRITZ!Fon MT-F empfangbar ist und mir bspw. Schalterzustände zeigt?
Danke für Hilfe.
Na ja, es ist vergleichsweise einfach.
RSS feeds sind XML Dokumente, die eventbasiert aktualisiert werden. Also benötigen wir einen Webserver ( Fritz!Box ) und schreiben dort eine korrekt formatierte Seite in Abhängigkeit von Ereignissen hin.
Auf der Fritz!Box 7390 ist das Webverzeichnis "/var/html", dort schreiben wir unsere XML Seite hin, etwa "/var/html/rss.xml"
Dazu erstellen wir ein shell script, das die letzte Zeile der aktuellen Logdatei ausliest und XML formatiert ausgibt:
#!/bin/ash
while true; do
a=$(wc -l var/log/fhem/fhem-????-??-??.log | cut -d " " -f 1)
echo -e "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n" > /var/html/rss.xml
echo -e "<rss version=\"2.0\">\n" >> /var/html/rss.xml
echo -e "<channel>\n" >> /var/html/rss.xml
echo -e "<title>FHEM Log Channel</title>\n" >> /var/html/rss.xml
echo -e "<description>Latest events from FHEM</description>\n" >> /var/html/rss.xml
echo -e "<description>The explanation of how the items are related goes here</description>\n" >> /var/html/rss.xml
echo -e "<link>http://www.directoryoflinksgohere</link>\n" >> /var/html/rss.xml
echo -e "<link>http://www.directoryoflinksgohere</link>\n" >> /var/html/rss.xml
echo -e "<item>\n" >> /var/html/rss.xml
echo -e "<title>Latest FHEM Log entry</title>\n" >> /var/html/rss.xml
echo -e "<description>$(sed $a!d var/log/fhem/fhem-????-??-??.log)</description>\n" >> /var/html/rss.xml
echo -e "<link>http://www.linkgoeshere.com</link>\n" >> /var/html/rss.xml
echo -e "</item>\n" >> /var/html/rss.xml
echo -e "</channel>\n" >> /var/html/rss.xml
echo -e "</rss>\n" >> /var/html/rss.xml
sleep 10
done
Das starten wir mit Verzeichnis/Skript & und schon haben wir ein RSS feed.
In der Fritz!Box muß das unter DECT/RSS-Nachrichten als FHEM / 192.168.178.1/rss.xml eingetragen werden. (Alle IP-Adressen und Verzeichnisse bitte den persönlichen Gegebenheiten anpassen)
Bei Nutzung von dyndns kann man die Seite auch für Zugriff aus dem Internet freigeben und mit beliebigen Geräten anzeigen lassen.
Die Textdarstellung im MT-D ist etwas dürftig, keine Ahnung wie das im MT-F aussieht, da muß vermutlich noch optimiert werden.
Hmmmm,
Im Log steht ja nicht immer der Schalterzustand. Wie realisiere ich dass, wenn ich bspw. Per RSS eine Liste aller Schalterzustände ablegen möchte?
Dann werte doch einfach die Status-Datei "fhem.save" aus. Da werden alle aktuellen Zustände abgelegt.
Etwa cat /var/InternerSpeicher/fhem/log/fhem.save | grep schalter
Das Ergebnis stellst Du dann in Deinen rss feed.
Einfach mal ein wenig basteln...
Wie sagt Daniel Düsentrieb so schön ? "Dem Ingeniör ist nichts zu schwör" ;-)
mit
a=$(echo "list * state" | socat - TCP:127.0.0.1:7072)
echo -e "$a"
kannst Du sehr schön alle (Schalt-)zustände auflisten. Das Ergebnis sollte sich ziemlich einfach ins rss-feed einbauen lassen...
Wie gesagt, dem Ingeniör...
Also gut, noch ein bißchen weiter, aber dann mußt Du alleine laufen ;-)
#!/bin/ash
# Irgendwohin kopieren, wo Du Skripte aufbewahrst, vielleicht "/var/InternerSpeicher/fhem/fhem-rssfeed" oder
# "/var/InternerSpeicher/fhem/FHEM/fhem-rssfeed". Aufpassen, daß es im UNIX Format bleibt (nur LF, kein CR)
# sonst behauptet Linux beim Aufruf, die Datei gäbe es nicht. Mit chmod +x fhem-rssfeed ausführbar machen,
# und anschließend mit ./fhem-rssfeed & starten. Bei Bedarf anhalten mit "kill $(pidof fhem-rssfeed)"
while true; do
echo -e "<?xml version=\"1.0\" encoding=\"utf-8\"?>" > /var/html/rss.xml
echo -e "<rss version=\"2.0\">" >> /var/html/rss.xml
echo -e "<channel>" >> /var/html/rss.xml
echo -e "<title>FHEM Geraete Status</title>" >> /var/html/rss.xml
echo -e "<link>http://192.168.178.1:8083/fhem?cmd=list+*+state</link>" >> /var/html/rss.xml
echo -e "<description>Zeigt in Intervallen den Status angeschlossener Geraete an</description>" >> /var/html/rss.xml
echo -e "<language>de-de</language>" >> /var/html/rss.xml
echo -e "<copyright>h.keeper(h.keeper@ymail.com)</copyright>" >> /var/html/rss.xml
echo -e "<pubDate>`date +%a", "%d" "%b" "%Y" "%H:%M:%S`</pubDate>" >> /var/html/rss.xml
echo -e "<image>" >> /var/html/rss.xml
echo -e "<url>http://fhem.de/www/images/default/fhemicon.png</url>" >> /var/html/rss.xml
echo -e "<title>FHEM Hausautomatisierung</title>" >> /var/html/rss.xml
echo -e "<link>http://www.fhem.de</link>" >> /var/html/rss.xml
echo -e "</image>" >> /var/html/rss.xml
echo -e "<item>" >> /var/html/rss.xml
echo -e "<title>Statusbericht von `date +%a", "%d" "%b" "%Y" "%H:%M:%S`</title>" >> /var/html/rss.xml
echo -e "<description>`echo "list * state" | socat - TCP:127.0.0.1:7072`</description>" >> /var/html/rss.xml
echo -e "<link>http://192.168.178.1:8083/fhem?cmd=list+*+state</link>" >> /var/html/rss.xml
echo -e "<author>h. keeper (h.keeper@ymail.com)</author>" >> /var/html/rss.xml
echo -e "<guid>http://192.168.178.1:8083/fhem</guid>" >> /var/html/rss.xml
echo -e "<pubDate>`date +%a", "%d" "%b" "%Y" "%H:%M:%S`</pubDate>" >> /var/html/rss.xml
echo -e "</item>" >> /var/html/rss.xml
echo -e "</channel>" >> /var/html/rss.xml
echo -e "</rss>" >> /var/html/rss.xml
sleep 120
done
Die Seite wird alle 2 Minuten aktualisiert, rss feed reader holen meistens in Intervallen > 15 Min die Inhalte ab. Die Fritz!Box läßt zwar ein Abrufintervall von 1 Min zu, aber tatsächlich kommen auf dem MT-D die Nachrichten in nicht nachvollziehbaren Zeiträumen an. Vom Samsung Galaxy Note 10.1 mit Feed+ geht es ganz zuverlässig.
Verschiedene Browser / Clients zeigen den feed unterschiedlich an. Mozilla Aurora kann Feeds mit Outlook als Client verknüpfen, da bekomme ich die Nachrichten alle soviel Zeiteinheiten in einen Ordner gelegt.
Danke für Deine "Anfängerfrage", die mich auf die Idee gebracht hat die Technik selbst zu nutzen.
Hallo Housekeeper,
habe es auf meiner Fritzbox 7390 so gemacht, wie Du beschreibst, bekomme aber vielfach folgende Fehlermeldung:
./fhem-rssfeed:line 37: can't create /var/html/rss.xml: Read-only file system
Mein /var/html verweist auf /usr/www/avm und dieser Ordner avm hat folgende Rechte:
drwxrwxr-x root root avm
Die Rechte lasses sich nicht ändern, da Read only Filesystem.
Kannst Du helfen?
Viele Grüße
eddtima
Zitat von: eddtima schrieb am Mi, 10 April 2013 22:54...bekomme aber vielfach folgende Fehlermeldung:
./fhem-rssfeed:line 37: can't create /var/html/rss.xml: Read-only file system
"Vielfach" bedeutet vermutlich "nicht immer", bei mir ist /var/html auch ein link auf /usr/www/avm
# ls -l /var/html
lrwxrwxrwx 1 root root 12 Jan 1 1970 /var/html -> /usr/www/avm
Bei mir läuft FHEM mit root-Rechten, vielleicht liegt es daran ?
Hallo housekeeper,
gute Idee, war mir gar nicht so bewusst, aber meine Installation lief unter user boxusr99. Bin nach diesem Thread http://www.fhemwiki.de/wiki/FritzBox:_fhem_unter_root_starten (//www.fhemwiki.de/wiki/FritzBox:_fhem_unter_root_starten) vorgegeangen und nun läuft auch bei mir der fhem-Prozess und fhem-rssfeed unter User root:
1504 root 15068 S perl fhem.pl fhem.cfg
2590 root 1256 S {fhem-rssfeed} /bin/ash ./fhem-rssfeed
Blöderweise kann fhem-rssfeed aber immer noch nicht unter /var/html schreiben, ich erhalte also für jeden versuchten Schreibvorgang Deines Skriptes:
./fhem-rssfeed:line 37: can't create /var/html/rss.xml: Read-only file system
Wenn ich als User root, zumindest behauptet id: uid = 0(root) gid=0(root), versuche in /var/html mittels cat 'test' > test
eine Datei anzulegen, bekomme ich die gleiche Fehlermeldung.
ls -al /var/html liefert lrwxrwxrwx 1 root root 12 Jan 1 1970 html -> /usr/www/avm
also die gleichen Rechte wie bei Dir.
Wieso kann ich denn als User root nicht in dieses Verzeichnis schreiben? Gibt es da irgendeinen Schreibschutz auf der Fritzbox? Ich verstehe es nicht, muss aber auch gestehen, das meine Unix/Linux Kenntnisse ziemlich angestaubt sind ...
Unter /tmp habe ich übrigens Schreibrechte ... Aber da kann ich ja die rss.xml nicht per Newsfeed auslesen, oder? Ein symbolischer Link von /var/html/rss.xml auf /tmp/rss.xml lässt sich natürlich auch nicht anlegen.
Fällt Dir noch was ein?
Viele Grüße
Till
Zitat von: eddtima schrieb am Do, 11 April 2013 22:33Fällt Dir noch was ein?
Zum Vergleich: Meine Fritz!Box ist 7390 AVM branded, Fritz!OS ist FRITZ!OS 05.51-24828 BETA
# cat jason_boxinfo.xml
<j:BoxInfo xmlns:j="http://jason.avm.de/updatecheck/">
<j:Name>FRITZ!Box Fon WLAN 7390</j:Name>
<j:HW>156</j:HW>
<j:Version>84.05.51-24828</j:Version>
<j:Revision>24828</j:Revision>
<j:Serial>MeineSeriennummer</j:Serial>
<j:OEM>avm</j:OEM>
<j:Lang>de</j:Lang>
<j:Annex>B</j:Annex>
<j:Lab>BETA</j:Lab>
<j:Country>049</j:Country></j:BoxInfo>
Ich habe aber noch ein zweites Teil von 1&1:
# cat jason_boxinfo.xml
<j:BoxInfo xmlns:j="http://jason.avm.de/updatecheck/">
<j:Name>FRITZ!Box Fon WLAN 7390 (UI)</j:Name>
<j:HW>156</j:HW>
<j:Version>84.05.51-24828</j:Version>
<j:Revision>24828</j:Revision>
<j:Serial>MeineSeriennummer</j:Serial>
<j:OEM>1und1</j:OEM>
<j:Lang>de</j:Lang>
<j:Annex>B</j:Annex>
<j:Lab>BETA</j:Lab>
<j:Country>049</j:Country>
<j:Flag>crashreport</j:Flag></j:BoxInfo>#
Das verhält sich so, wie von Dir beschrieben.
Dazu fallen mir drei Lösungsansätze ein:
Entweder mit Hilfe von Freetz das "Branding" entfernen (und möglicherweise noch andere Sachen)
Von
www.freetz.org mit
svn co http://svn.freetz.org/trunk freetz-trunk
Freetz Compiler auf einem Linux Rechner installieren, dann
cd freetz-trunk
make menuconfig
Oder die RSS Datei woanders ablegen, die muß ja nur von Deinem Client aus erreichbar sein. Da RSS Clients nur in Abständen die Information abholen, reicht eine statische HTML Datei die bei Änderungen neu angelegt wird.
Alternativ die Spezialisten auf
http://www.ip-phone-forum.de/ fragen, ob es eine Möglichkeit gibt, diese Sperre zu umgehen, ohne die Fritz!Box komplett umzukrempeln.
Unqualifizierte Zwischenfrage von mir:
Bevor man die ganze Fritzbox umkrempelt um Zugriff auf den internen Webserver zu erhalten, kann man das XML nicht einfach über den FHEM-Server verteilen? Darauf sollte man ja Zugriff haben.
Es gibt sogar ein fertiges RSS-Modul. Das habe ich aber noch nie benutzt und weiß nicht, ob es unter der FB und für das Fritz!Fon überhaupt funktioniert.
Zitat von: Carsten schrieb am Fr, 12 April 2013 10:01Bevor man die ganze Fritzbox umkrempelt um Zugriff auf den internen Webserver zu erhalten, kann man das XML nicht einfach über den FHEM-Server verteilen? Darauf sollte man ja Zugriff haben.
Versuch mal
http://192.168.178.1:8083/fhem/docs/rss-feed.xml
das sollte auch gehen.
Hallo Housekeeper, Carsten,
ich bin begeistert und sehe Licht am Ende des Tunnels! Wie von Euch vorgeschlagen, schreibe ich die rss.xml jetzt in /var/InternerSpeicher/fhem/docs/rss.xml und die Datei wird auch tatsächlich ohne Murren angelegt. Zur Kontrolle: Ein Aufruf im Browser von http://192.168.1.1:8083/fhem/docs/rss.xml (//192.168.1.1:8083/fhem/docs/rss.xml) liefert einen fehlerlosen FHEM-RSS-Feed mit allen Aktorzuständen etc!
In der Fritzbox 7390 unter DECT > RSS-Nachrichten habe ich den RSS Feed angelegt und verweise auf die Internetadresse: http://192.168.1.1:8083/fhem/docs/rss.xml
Weitere RSS-Feeds, wie zB. http://www.wetter.com/wetter_rss/wetter.xml (//www.wetter.com/wetter_rss/wetter.xml) werden korrekt ausgegeben.
Aber die Darstellung auf dem MT-F gelingt nicht: Der Aufruf im MT-F von Menue > Internetdienste > RSS-Nachrichten > FHEM führt zur Ausgabe: "Keine RSS-Nachrichten vorhanden"
Was kann das sein?
Zitat von: eddtima schrieb am Fr, 12 April 2013 20:39Was kann das sein?
Das liegt vermutlich daran, daß der Fritz! Box RSS-Client relativ simpel ist, einfach mal die RSS-Feeds im Quelltext anschauen und die Gestaltung von denen übernehmen, die korrekt angezeigt werden. Es gibt übrigens jede Menge Webseiten, die sich mit Aufbau und Gestaltung von RSS-Feeds beschäftigen. GOOGLE ist Dein Freund!
Möglicherweise liegt es auch daran, daß der Fritz!Box RSS-Client die Portangabe ( 8083 anstelle von 80 ) nicht mag. Auf dem Telefon wird zwar der Feed angezeigt, aber wenn man den aufruft, sagt das Telefon: "Keine RSS-Nachrichten vorhanden."
Ich habe zum Testen einfach mit wget eine reale RSS-Seite kopiert, wenn die im Internet funktioniert, muß sie auch von der Fritz!Box korrekt gelesen werden.
Auf der 1und1 Fritz!Box habe ich jetzt mal folgendes probiert:
Das komplette Verzeichnis /usr/www/1und1 nach /var/InternerSpeicher kopiert.
cp -R /usr/www/1und1 /var/InternerSpeicher/
Zur Sicherheit nochmals schreibbar gesetzt
chmod -R 777 /var/InternerSpeicher/1und1
Das Link /var/html gelöscht
rm /var/html
Das Link mit neuem Ziel wieder erstellt
ln -s /var/InternerSpeicher/1und1/ /var/html
In das Verzeichnis gewechselt
cd /var/html
Mit wget eine live RSS-Datei hineinkopiert
wget http://www.wetter24.de/rss_full.xml
In der Fritz!Box 1 den FEED angelegt, Fritz!Box 2 hat IP 192.168.178.65
http://192.168.178.65/rss_full.xml
Und schon piept mein Fritz!Fon und zeigt mir den Feed an.
Das ist zwar ein wenig "von hinten durch die Brust ins Auge" funktioniert aber und kann verwendet werden bis "DIE" Lösung gefunden ist. Kaputt machen kann man auch nichts, die Änderungen sind nach dem Neustart wieder weg. Trotzdem: Ich übernehme keine Verantwortung oder Haftung für Schäden die Ihr Eurer Fritz!Box zufügt. Bitte _vor_ dem Experimentieren sicherstellen, daß Ihr Eure Daten gesichert habt, und wißt, wie man eine Fritz!Box in den Fabrik-Zustand zurücksetzt.
Hallo,
ich habe mich auch mal in Eueren Tread eingearbeitet, aber so fit scheine ich noch nicht zu sein... wo muß ich die obere Befehlsliste einkopieren und wie starte ich dann die RSS Funktion.
Ich habe jetzt die Befehlsliste umgearbeitet und alle Befehle in /var/InternerSpeicher/fhem/docs/rss.xml ergänzt. Dann habe ich die Befehlsliste in die fhem Browser-Seite einkopiert und unter fhem.rss-feed gespeichert, so ist sie nun unter \\192.168.178.1\fritz.nas\fhem\FHEM zu finden...
Und hier werde ich wohl was falsch verstanden haben... könntet Ihr mir eine kleine step bei step Hilfe geben wie ich die Befehlsliste korrekt ein kopiere, dann einbinde und starte ?
Das wäre supper :-) , vielen Dank, Gruß mathyou.
Also nach neuesten Erkenntnissen über meine Fritz!Boxen liegt es nicht am "Branding", daß der integrierte Webserver nicht zu nutzen ist, sondern daran, daß die Dateien tatsächlich im Nur-Lese-Speicher angelegt sind.
Auf einer Fritz!Box habe ich das Telefonsparbuch (Harald Becker / www.Telefon-Sparbuch.de (//www.telefonsparbuch.de)) installiert, das nutzt den integrierten Webserver mit einem ähnlichen Trick wie von mir beschrieben.
Also habe ich das Shell Skript jetzt noch mal ergänzt, so sollte es für alle (mindesten 7390) funktionieren.
#!/bin/ash
# Irgendwohin kopieren, wo Du Skripte aufbewahrst, vielleicht "/var/InternerSpeicher/fhem/fhem-rssfeed" oder
# "/var/InternerSpeicher/fhem/FHEM/fhem-rssfeed". Aufpassen, daß es im UNIX Format bleibt (nur LF, kein CR)
# sonst behauptet Linux beim Aufruf, die Datei gäbe es nicht. Mit chmod +x fhem-rssfeed ausführbar machen,
# und anschließend mit ./fhem-rssfeed & starten. Bei Bedarf anhalten mit "kill $(pidof fhem-rssfeed)"
webdir=/usr/www/$(ls -l /var/html | cut -d / -f 6)
if [ ! $(echo 2>/dev/null "" > $webdir/rss.xml) ];
then
tar cf /var/www.tar $webdir
mount -t tmpfs tmpfs $webdir
tar xf /var/www.tar -C /
rm /var/www.tar
echo -n > /var/html/rss.xml
fi
while true; do
echo -e "<?xml version=\"1.0\" encoding=\"utf-8\"?>" > /var/html/rss.xml
echo -e "<rss version=\"2.0\">" >> /var/html/rss.xml
echo -e "<channel>" >> /var/html/rss.xml
echo -e "<title>FHEM Geraete Status</title>" >> /var/html/rss.xml
echo -e "<link>http://192.168.178.1:8083/fhem?cmd=list+*+state</link>" >> /var/html/rss.xml
echo -e "<description>Zeigt in Intervallen den Status angeschlossener Geraete an</description>" >> /var/html/rss.xml
echo -e "<language>de-de</language>" >> /var/html/rss.xml
echo -e "<copyright>h.keeper(h.keeper@ymail.com)</copyright>" >> /var/html/rss.xml
echo -e "<pubDate>`date +%a", "%d" "%b" "%Y" "%H:%M:%S`</pubDate>" >> /var/html/rss.xml
echo -e "<image>" >> /var/html/rss.xml
echo -e "<url>http://fhem.de/www/images/default/fhemicon.png</url>" >> /var/html/rss.xml
echo -e "<title>FHEM Hausautomatisierung</title>" >> /var/html/rss.xml
echo -e "<link>http://www.fhem.de</link>" >> /var/html/rss.xml
echo -e "</image>" >> /var/html/rss.xml
echo -e "<item>" >> /var/html/rss.xml
echo -e "<title>Statusbericht von `date +%a", "%d" "%b" "%Y" "%H:%M:%S`</title>" >> /var/html/rss.xml
echo -e "<description>`echo "list .* state" | socat - TCP:127.0.0.1:7072`</description>" >> /var/html/rss.xml
echo -e "<link>http://192.168.178.1:8083/fhem?cmd=list+*+state</link>" >> /var/html/rss.xml
echo -e "<author>h. keeper (h.keeper@ymail.com)</author>" >> /var/html/rss.xml
echo -e "<guid>http://192.168.178.1:8083/fhem</guid>" >> /var/html/rss.xml
echo -e "<pubDate>`date +%a", "%d" "%b" "%Y" "%H:%M:%S`</pubDate>" >> /var/html/rss.xml
echo -e "</item>" >> /var/html/rss.xml
echo -e "</channel>" >> /var/html/rss.xml
echo -e "</rss>" >> /var/html/rss.xml
sleep 120
done