Ankündigung

Einklappen
Keine Ankündigung bisher.

HowTo: RSS Feed

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] HowTo: RSS Feed

    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
    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>
    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
    Code:
    logInfo("RSS", "Wohnungsstatus: Anwesend")
    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:


    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;
    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
    Zuletzt geändert von staehler; 07.09.2015, 11:46.

    #2
    Toll! Ich glaube das ist genau, dass was ich suche!
    Da ich Anfänger bin: Wie kann ich mir dieses Log denn jetzt in CometVisu anzeigen lassen?

    Gruß
    Stefan

    Kommentar


      #3
      In cometVISU gibt es ein rss-Plugin. Das musst Du aktivieren und "mit Leben füllen", sprich URL, etc. dann eintragen.
      Code:
          <plugins>
            <plugin name="strftime"/>
            <plugin name="timeout"/>
      [COLOR=#FF0000]      <plugin name="rss"/>[/COLOR]
            <plugin name="gauge"/>
          </plugins>
      Code:
          <group nowidget="false" name="Meldungen" class="rssfeed">
            <rss src="http://<url>/rssfile.rss" header="true" date="true" content="true" link="false" title="false" linktarget="_blank" limit="10" refresh="60"/>
          </group>

      Kommentar


        #4
        danke dir werde ich mal ausprobieren

        Kommentar


          #5
          Hi,

          vielen dank für den tollen Ansatz. Ich habe noch ein paar Probleme. In deiner Code Beschreibung scheint ein Fehler zu sein ( my $filename = 'rssfile' ) da fehlt das Semikolon am Ende. Nachdem ich das angepasst hatte läuft schonmal das Perl Script durch. Es erzeugt bei mir aber kein neues RSS File sondern überschreibt das angegebene LOG File das eigentlich ausgelesen werden sollte. Anbei mein geänderter Code:

          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      = 'http://nas:8082/';
          my $email    = 'myself@gmx.de';
          my $ohbase   = '/share/HDA_DATA/.qpkg/openHAB';
          my $filename = 'openhab';
          
          rss_new( $url, "openHAB News", "Meldungen und Alarme von openHAB" );
          rss_allow_duplicates(1);
          rss_language( 'de' );
          rss_webmaster( $email );
          rss_history_file( "$ohbase/logs/${filename}.log" );
          
          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( "$ohbase/webapps/cometVISU\plugins\rsslog\$filename.rss", 45 );
          exit;
          Inhalt des openhab.log nach Durchführung des Scripts:

          Code:
          http://nas:8082/    1441534887    1441534887
          Was mache ich hier falsch?

          mfg René
          Zuletzt geändert von rene54321; 06.09.2015, 11:23.

          Kommentar


            #6
            Hi René,

            danke, das mit dem Semikolon habe ich oben ausgebessert.
            Ich finde keinen grundsätzlichen Fehler, ausser dass mit Deinen Slashes "/" und Backslashes "" in
            Code:
             
             rss_save( "$ohbase/webapps/cometVISU\plugins\rsslog\$filename.rss", 45 );
            was nicht stimmt.
            Was sagt denn die Konsole, wenn Du das Skript ausführst. Wird was in
            $filename.rss geschrieben? Wird was in
            $filename.log geschrieben?
            Gruß Michael

            Kommentar


              #7
              Mach mal aus dem
              Code:
               
               rss_history_file( "$ohbase/logs/${filename}.log" );
              ein
              Code:
               
               rss_history_file( "$ohbase/logs/${filename}.[COLOR=#FF0000]dat[/COLOR]" );
              Das ist der Fehler.

              Kommentar


                #8
                Hi,

                super jetzt wirds schonmal erzeugt danke danke :-). Leider bekomme ich nach dem Einbinden in der CometVISU einen Fehler "feed could not be loaded". Wenn ich die Adresse direkt in den Browser eingebe "http://192.168.0.100/cometVISU/RSSCreator/rssfile.rss" wird der Feed aber angezeigt. Das File liegt nicht im Openhab WebServer Verzeichnis sondern auf einen anderen. Wenn ich den Openhab Web Server benutze der ja auf PORT 8082 läuft bekomme ich die Fehlermeldung das der Port nicht unterstützt wird. Noch eine Idee?

                Code:
                    <!-- RSS Log -->
                      <group nowidget="true" name="Meldungen" class="rssfeed">
                      <layout colspan="12"/>
                      <rss src="http://192.168.0.100/cometVISU/RSSCreator/rssfile.rss" header="true" date="true" content="true" link="false" title="false" linktarget="_blank" limit="10" refresh="60"/>
                    </group>
                mfg René

                Kommentar

                Lädt...
                X