Hallo,
ich möchte mir gerne wichtige und interessante Meldungen/Alarme von openHAB in einem RSS-Feed ausgeben lassen. Diesen möchte ich mir an meinen Squeezeboxen, in der cometVISU oder sonstigen RSS-Reader anzeigen lassen.
Voraussetzung ist ein Webserver, der diesen Feed streamt. Der openHAB jetty zeigt zwar was an, sieht aber nicht wie ein RSS-Feed aus.
1. Schritt (logback.xml anpassen):
Zuerst muss das logback.xml angepasst werden, damit ein separates Logfile erzeugt wird. Dieses Log wird später regelmäßig zu einem RSS-Feed verarbeitet.
logback.xml
Der rot markierte Teil muss ins logback.xml aufgenommen werden.
2. Schritt (Ausgaben erzeugen in rules-Dateien):
In den rules Dateien kann nun mit der Anweisung
eine Logzeile im <openhab-Logverzeichnis>/rssfile.log erzeugt werden.
3. Schritt (RSS erzeugen):
Der nächste Schritt ist nun, dieses Logfile umzusortieren, damit chronologisch die Einträge von oben (neu) nach unten (alt) sortiert sind. Außerdem sollen diese Zeilen in ein RSS-Format überführt werden. Dazu habe ich ein kleines Perl-Skript geschrieben:
Das Perl-Skript muss noch an wenigen Stellen angepasst werden (rot). Das Perl-Modul XML::RSS::SimpleGen installieren.
Dieses Perlskript per Cron regelmäßig ausführen lassen.
Ich hab es zwar noch nicht ausgiebig getestet, sollte aber funktionieren.
Viele Spaß damit!
Viele Grüße
Michael
ich möchte mir gerne wichtige und interessante Meldungen/Alarme von openHAB in einem RSS-Feed ausgeben lassen. Diesen möchte ich mir an meinen Squeezeboxen, in der cometVISU oder sonstigen RSS-Reader anzeigen lassen.
Voraussetzung ist ein Webserver, der diesen Feed streamt. Der openHAB jetty zeigt zwar was an, sieht aber nicht wie ein RSS-Feed aus.
1. Schritt (logback.xml anpassen):
Zuerst muss das logback.xml angepasst werden, damit ein separates Logfile erzeugt wird. Dieses Log wird später regelmäßig zu einem RSS-Feed verarbeitet.
logback.xml
Code:
<configuration scan="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%-30.30logger{36}] - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${openhab.logdir:-logs}/openhab.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- weekly rollover and archiving --> <fileNamePattern>${openhab.logdir:-logs}/openhab-%d{yyyy-ww}.log.zip</fileNamePattern> <!-- maximum number of archive files to keep --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%-30.30logger{36}] - %msg%n</pattern> </encoder> </appender> <appender name="EVENTFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${openhab.logdir:-logs}/events.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- weekly rollover and archiving --> <fileNamePattern>${openhab.logdir:-logs}/events-%d{yyyy-ww}.log.zip</fileNamePattern> <!-- maximum number of archive files to keep --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern> </encoder> </appender> [B][COLOR=Red] <appender name="RSSFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${openhab.logdir:-logs}/rssfile.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover and archiving --> <fileNamePattern>${openhab.logdir:-logs}/rssfile-%d{yyyy-MM-dd}.log.zip</fileNamePattern> <!-- maximum number of archive files to keep --> <maxHistory>3</maxHistory> </rollingPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d{HH:mm} - %msg%n</pattern> </encoder> </appender> <!-- this logger is used for RSS feed, use logDebug --> <logger name="org.openhab.model.script.RSS" level="INFO" additivity="false"> <appender-ref ref="RSSFILE" /> </logger>[/COLOR][/B] <logger name="runtime.busevents" level="INFO" additivity="false"> <appender-ref ref="EVENTFILE" /> <appender-ref ref="STDOUT" /> </logger> <logger name="org.openhab" level="INFO"/> <!-- this class gives an irrelevant warning at startup --> <logger name="org.atmosphere.cpr.AtmosphereFramework" level="ERROR" /> <!-- temporary workaround for https://github.com/openhab/jmdns/issues/12 --> <logger name="javax.jmdns" level="OFF"/> <!-- temporary workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=402750 --> <logger name="OSGi" level="OFF" /> <!-- temporary workaround to circumvent error messages with any obvious effect --> <logger name="org.atmosphere.cpr.AtmosphereFramework" level="OFF" /> <root level="WARN"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> </root> </configuration>
2. Schritt (Ausgaben erzeugen in rules-Dateien):
In den rules Dateien kann nun mit der Anweisung
Code:
logInfo("RSS", "Wohnungsstatus: Anwesend")
3. Schritt (RSS erzeugen):
Der nächste Schritt ist nun, dieses Logfile umzusortieren, damit chronologisch die Einträge von oben (neu) nach unten (alt) sortiert sind. Außerdem sollen diese Zeilen in ein RSS-Format überführt werden. Dazu habe ich ein kleines Perl-Skript geschrieben:
Code:
#!/usr/bin/perl # Usage: # ./rss_generator.pl # reads $ohbase/logs/$filename.log and converts it to # $ohbase/webapps/RSS/$filename.rss use strict; use XML::RSS::SimpleGen; use utf8; use open ':utf8'; # opens file in utf-8 for german umlauts my $url = '[COLOR=Red]http://my.openhab.com/[/COLOR]'; my $email = '<[COLOR=Red]Email Adresse[/COLOR]>'; my $ohbase = '[COLOR=Red]/opt/usr/openhab[/COLOR]'; my $filename = [COLOR=Black]'rssfile'[/COLOR]; rss_new( $url, "openHAB News", "Meldungen und Alarme von openHAB" ); rss_allow_duplicates(1); rss_language( 'de' ); rss_webmaster( $email ); rss_history_file( "$ohbase/webapps/RSS/${filename}.dat" ); open(IN, "$ohbase/logs/$filename.log") or die "Error open() $!"; my @zeilen_rueckwaerts = reverse <IN>; close(IN) or die "Fehler close() $!"; foreach (@zeilen_rueckwaerts) { rss_item($url, $_); } die "No items in this content?! {{\n$_\n}}\nAborting" unless rss_item_count(); # Location of RSS-File on Webserver rss_save( "[COLOR=Red]$ohbase/webapps/RSS/$filename.rss[/COLOR]", 45 ); exit;
Dieses Perlskript per Cron regelmäßig ausführen lassen.
Ich hab es zwar noch nicht ausgiebig getestet, sollte aber funktionieren.
Viele Spaß damit!
Viele Grüße
Michael
Kommentar