I created such a solution some time ago. Maybe it is helpful to you too.
In requestScope "rowsPerPage" you can define how many rows should visible per page and with requestScope "secondsPerPage" you define the number of seconds after it shall change the page. After arriving last page it starts again with first page.
<xp:this.beforeRenderResponse><![CDATA[#{javascript:
requestScope.rowsPerPage = 4;
requestScope.secondsPerPage = 2;
if (viewScope.currentPage == null) {
viewScope.put("currentPage", 1);
} else {
if (getComponent("viewPanel1").getRowCount() > viewScope.currentPage * requestScope.rowsPerPage) {
viewScope.currentPage++;
getComponent("viewPanel1").gotoNextPage();
} else {
viewScope.currentPage = 1;
getComponent("viewPanel1").gotoFirstPage();
}
}
}]]></xp:this.beforeRenderResponse>
<xp:scriptBlock
id="scriptBlockRefresh">
<xp:this.value>
<![CDATA[
setInterval(function() {
XSP.partialRefreshPost("#{id:refreshPanel}", {})
}, #{requestScope.secondsPerPage} *1000)
]]>
</xp:this.value>
</xp:scriptBlock>
<xp:panel
id="refreshPanel">
<xp:viewPanel
rows="#{javascript:try {requestScope.rowsPerPage} catch(e) {30}}"
id="viewPanel1"
xp:key="facet1"
viewStyle="width:40em">
<xp:this.facets>
<xp:pager
partialRefresh="true"
layout="Group"
xp:key="headerPager"
id="pager1"
alwaysCalculateLast="true">
</xp:pager>
</xp:this.facets>
<xp:this.data>
<xp:dominoView
...>
</xp:dominoView>
</xp:this.data>
<xp:viewColumn
...>
</xp:viewColumn>
<xp:viewColumn
...>
</xp:viewColumn>
</xp:viewPanel>
</xp:panel>