2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2024-11-21 20:49:51 +00:00

01_FHEMWEB.pm: parallel computing of non-embed SVG and other small changes (Forum #82351)

git-svn-id: https://svn.fhem.de/fhem/trunk@16985 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2018-07-15 14:08:15 +00:00
parent 97a34aa4bd
commit 35a1cfa800
10 changed files with 386 additions and 206 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- change: 01_FHEMWEB.pm: default plotEmbed to 0 (Forum #82351)
- feature: 73_GardenaSmartBridge: 74_GeardenaSmartDevice: add support for
Irrigation Control
- change: 98_feels_like.pm: Improved algorithms, fix reDEFINE

View File

@ -6,6 +6,7 @@ use strict;
use warnings;
use TcpServerUtils;
use HttpUtils;
use Blocking;
use Time::HiRes qw(gettimeofday);
#########################
@ -89,9 +90,7 @@ use vars qw($FW_userAgent); # user agent string
$FW_formmethod = "post";
my $FW_zlib_checked;
my $FW_use_zlib = 1;
my $FW_use_sha = 0;
my %FW_use;
my $FW_activateInform = 0;
my $FW_lastWebName = ""; # Name of last FHEMWEB instance, for caching
my $FW_lastHashUpdate = 0;
@ -119,6 +118,7 @@ my $FW_headerlines; #
my $FW_chash; # client fhem hash
my $FW_encoding="UTF-8";
my $FW_styleStamp=time();
my %FW_svgData;
#####################################
@ -228,13 +228,21 @@ FHEMWEB_Initialize($)
}
}
eval { require Digest::SHA; };
if($@) {
Log 4, $@;
Log 3, "FHEMWEB: Can't load Digest::SHA, ".
"longpoll via websocket is not available";
my %optMod = (
zlib => { mod=>"Compress::Zlib", txt=>"compressed HTTP transfer" },
sha => { mod=>"Digest::SHA", txt=>"longpoll via websocket" },
base64 => { mod=>"MIME::Base64", txt=>"parallel SVG computing" }
);
foreach my $mod (keys %optMod) {
eval "require $optMod{$mod}{mod}";
if($@) {
Log 4, $@;
Log 3, "FHEMWEB: Can't load $optMod{$mod}{mod}, ".
"$optMod{$mod}{txt} is not available";
} else {
$FW_use{$mod} = 1;
}
}
$FW_use_sha = 1;
}
#####################################
@ -310,20 +318,6 @@ FW_Read($$)
$FW_subdir = "";
my $c = $hash->{CD};
if(!$FW_zlib_checked) {
$FW_zlib_checked = 1;
$FW_use_zlib = AttrVal($FW_wname, "fwcompress", 1);
if($FW_use_zlib) {
eval { require Compress::Zlib; };
if($@) {
$FW_use_zlib = 0;
Log3 $FW_wname, 1, $@;
Log3 $FW_wname, 1,
"$FW_wname: Can't load Compress::Zlib, deactivating compression";
$attr{$FW_wname}{fwcompress} = 0;
}
}
}
if(!$reread) {
# Data from HTTP Client
@ -478,7 +472,7 @@ FW_Read($$)
$FW_CSRF = (defined($defs{$FW_wname}{CSRFTOKEN}) ?
"&fwcsrf=".$defs{$FW_wname}{CSRFTOKEN} : "");
if($FW_use_sha && $method eq 'GET' &&
if($FW_use{sha} && $method eq 'GET' &&
$FW_httpheader{Connection} && $FW_httpheader{Connection} =~ /Upgrade/i) {
my $shastr = Digest::SHA::sha1_base64($FW_httpheader{'Sec-WebSocket-Key'}.
@ -504,7 +498,7 @@ FW_Read($$)
$arg = "" if(!defined($arg));
Log3 $FW_wname, 4, "$name $method $arg; BUFLEN:".length($hash->{BUF});
my $pf = AttrVal($FW_wname, "plotfork", undef);
my $pf = AttrVal($FW_wname, "plotfork", 0);
if($pf) { # 0 disables
# Process SVG rendering as a parallel process
my $p = $data{FWEXT};
@ -540,12 +534,22 @@ FW_Read($$)
FW_closeConn($hash);
return;
}
return if($cacheable == -2); # async op, well be answered later
FW_finishRead($hash, $cacheable, $arg);
}
sub
FW_finishRead($$$)
{
my ($hash, $cacheable, $arg) = @_;
my $name = $hash->{NAME};
my $compressed = "";
if($FW_RETTYPE =~ m/(text|xml|json|svg|script)/i &&
($FW_httpheader{"Accept-Encoding"} &&
$FW_httpheader{"Accept-Encoding"} =~ m/gzip/) &&
$FW_use_zlib) {
$FW_use{zlib}) {
utf8::encode($FW_RET)
if(utf8::is_utf8($FW_RET) && $FW_RET =~ m/[^\x00-\xFF]/ );
eval { $FW_RET = Compress::Zlib::memGzip($FW_RET); };
@ -558,7 +562,7 @@ FW_Read($$)
my $length = length($FW_RET);
my $expires = ($cacheable?
("Expires: ".FmtDateTimeRFC1123($now+900)."\r\n") : "");
("Expires: ".FmtDateTimeRFC1123($hash->{LASTACCESS}+900)."\r\n") : "");
Log3 $FW_wname, 4,
"$FW_wname: $arg / RL:$length / $FW_RETTYPE / $compressed / $expires";
if( ! FW_addToWritebuffer($hash,
@ -1025,7 +1029,7 @@ FW_answerCall($)
my $csrf= ($FW_CSRF ? "fwcsrf='$defs{$FW_wname}{CSRFTOKEN}'" : "");
my $gen = 'generated="'.(time()-1).'"';
my $lp = 'longpoll="'.AttrVal($FW_wname,"longpoll",
$FW_use_sha && $FW_userAgent=~m/Chrome/ ? "websocket": 1).'"';
$FW_use{sha} && $FW_userAgent=~m/Chrome/ ? "websocket": 1).'"';
$FW_id = $FW_chash->{NR} if( !$FW_id );
my $dataAttr = FW_dataAttr();
@ -1069,15 +1073,16 @@ FW_answerCall($)
return $ret if($ret);
}
my $srVal = 0;
if($cmd =~ m/^style /) { FW_style($cmd,undef); }
elsif($FW_detail) { FW_doDetail($FW_detail); }
elsif($FW_room) { FW_showRoom(); }
elsif($FW_room) { $srVal = FW_showRoom(); }
elsif(!defined($FW_cmdret) &&
!$FW_contentFunc) {
$FW_room = AttrVal($FW_wname, "defaultRoom", '');
if($FW_room ne '') {
FW_showRoom();
$srVal = FW_showRoom();
} else {
my $motd = AttrVal("global","motd","none");
@ -1086,6 +1091,7 @@ FW_answerCall($)
}
}
}
return $srVal if($srVal);
FW_pO "</body></html>";
return 0;
}
@ -1810,7 +1816,7 @@ FW_sortIndex($)
sub
FW_showRoom()
{
return if(!$FW_room);
return 0 if(!$FW_room);
%FW_hiddengroup = ();
foreach my $r (split(",",AttrVal($FW_wname, "hiddengroup", ""))) {
@ -1898,15 +1904,60 @@ FW_showRoom()
FW_pO "</table><br>";
# Now the "atEnds"
foreach my $d (sort { $sortIndex{$a} cmp $sortIndex{$b} } @atEnds) {
my $doBC = (AttrVal($FW_wname, "plotfork", 0) &&
AttrVal($FW_wname, "plotEmbed", 0) == 0);
my %res;
my $idx = 1;
@atEnds = sort { $sortIndex{$a} cmp $sortIndex{$b} } @atEnds;
foreach my $d (@atEnds) {
no strict "refs";
my $fn = $modules{$defs{$d}{TYPE}}{FW_summaryFn};
$extPage{group} = "atEnd";
FW_pO &{$modules{$defs{$d}{TYPE}}{FW_summaryFn}}($FW_wname, $d,
$FW_room, \%extPage);
$extPage{index} = $idx++;
if($doBC && $defs{$d}{TYPE} eq "SVG" && $FW_use{base64}) {
BlockingCall(sub {
return "$FW_cname,$d,".
encode_base64(&{$fn}($FW_wname,$d,$FW_room,\%extPage),'');
}, undef, "FW_svgCollect");
} else {
$res{$d} = &{$fn}($FW_wname,$d,$FW_room,\%extPage);
}
use strict "refs";
}
return FW_svgDone(\%res, \@atEnds, undef);
}
sub
FW_svgDone($$$)
{
my ($res, $atEnds, $delayedReturn) = @_;
if(int(keys %{$res}) != int(@{$atEnds})) {
$FW_svgData{$FW_cname} = { FW_RET=>$FW_RET, RES=>$res, ATENDS=>$atEnds };
return -2 ;
}
foreach my $d (@{$atEnds}) {
FW_pO $res->{$d};
}
FW_pO "</div>";
FW_pO "</form>";
FW_pO "</body></html>" if($delayedReturn);
return 0;
}
sub
FW_svgCollect($)
{
my ($cname,$d,$enc) = split(",",$_[0],3);
my $h = $FW_svgData{$cname};
my ($res, $atEnds) = ($h->{RES}, $h->{ATENDS});
$res->{$d} = decode_base64($enc);
return if(int(keys %{$res}) != int(@{$atEnds}));
$FW_RET = $h->{FW_RET};
delete($FW_svgData{$cname});
FW_svgDone($res, $atEnds, 1);
FW_finishRead($defs{$cname}, 0, "");
}
# Room1:col1group1,col1group2|col2group1,col2group2 Room2:...
@ -2021,7 +2072,7 @@ FW_returnFileAsStream($$$$$)
$etag = defined($etag) ? "ETag: \"$etag\"\r\n" : "";
my $expires = $cacheable ? ("Expires: ".gmtime(time()+900)." GMT\r\n"): "";
my $compr = ($FW_httpheader{"Accept-Encoding"} &&
$FW_httpheader{"Accept-Encoding"} =~ m/gzip/ && $FW_use_zlib) ?
$FW_httpheader{"Accept-Encoding"} =~ m/gzip/ && $FW_use{zlib}) ?
"Content-Encoding: gzip\r\n" : "";
TcpServer_WriteBlocking($FW_chash, "HTTP/1.1 200 OK\r\n".
$compr . $expires . $FW_headerlines . $etag .
@ -2608,7 +2659,7 @@ FW_Attr(@)
if($attrName eq "longpoll" && $type eq "set" && $param[0] eq "websocket") {
return "$devName: Could not load Digest::SHA on startup, no websocket"
if(!$FW_use_sha);
if(!$FW_use{sha});
}
return $retMsg;
@ -3732,25 +3783,18 @@ FW_widgetOverride($$)
</li><br>
<a name="plotEmbed"></a>
<li>plotEmbed 0<br>
SVG plots are rendered as part of &lt;embed&gt; tags, as in the past
this was the only way to display SVG, and it allows to render them in
parallel, see plotfork.
Setting plotEmbed to 0 will render SVG in-place, but as a side-effect
makes the plotfork attribute meaningless.<br>
<li>plotEmbed<br>
If set (to 1), SVG plots will be rendered as part of &lt;embed&gt;
tags, as in the past this was the only way to display SVG. Setting
plotEmbed to 0 (the default) will render SVG in-place.<br>
</li><br>
<a name="plotfork"></a>
<li>plotfork [&lt;&Delta;p&gt;]<br>
<li>plotfork<br>
If set to a nonzero value, run part of the processing (e.g. <a
href="#SVG">SVG</a> plot generation or <a href="#RSS">RSS</a> feeds) in
parallel processes. Actually, child processes are forked whose
priorities are the FHEM process' priority plus &Delta;p.
Higher values mean lower priority. e.g. use &Delta;p= 10 to renice the
child processes and provide more CPU power to the main FHEM process.
&Delta;p is optional and defaults to 0.<br>
Note: do not use it
on Windows and on systems with small memory footprint.
parallel processes, default is 0. Note: do not use it on systems with
small memory footprint.
</li><br>
<a name="plotmode"></a>
@ -4439,24 +4483,17 @@ FW_widgetOverride($$)
<a name="plotEmbed"></a>
<li>plotEmbed 0<br>
SVG Grafiken werden als Teil der &lt;embed&gt; Tags dargestellt, da
fr&uuml;her das der einzige Weg war SVG darzustellen, weiterhin
erlaubt es das parallele Berechnen via plotfork (s.o.)
Falls plotEmbed auf 0 gesetzt wird, dann werden die SVG Grafiken als
Teil der HTML-Seite generiert, was leider das plotfork Attribut
wirkungslos macht.
Falls gesetzt (auf 1), dann werden SVG Grafiken mit &lt;embed&gt; Tags
gerendert, da auf &auml;lteren Browsern das die einzige
M&ouml;glichkeit war, SVG dastellen zu k&ouml;nnen. Falls 0 (die
Voreinstellung), dann werden die SVG Grafiken "in-place" gezeichnet.
</li><br>
<a name="plotfork"></a>
<li>plotfork<br>
Normalerweise wird die Ploterstellung im Hauptprozess ausgef&uuml;hrt,
FHEM wird w&auml;rend dieser Zeit nicht auf andere Ereignisse
reagieren.
Falls dieses Attribut auf einen nicht 0 Wert gesetzt ist, dann wird die
Berechnung in weitere Prozesse ausgelagert. Das kann die Berechnung auf
Rechnern mit mehreren Prozessoren beschleunigen, allerdings kann es auf
Rechnern mit wenig Speicher (z.Bsp. FRITZ!Box 7390) zum automatischen
Abschuss des FHEM Prozesses durch das OS f&uuml;hren.
Falls gesetzt, dann werden bestimmte Berechnungen (z.Bsp. SVG und RSS)
auf nebenl&auml;ufige Prozesse verteilt. Voreinstellung ist 0. Achtung:
nicht auf Systemen mit wenig Hauptspeicher verwenden.
</li><br>
<a name="plotmode"></a>

View File

@ -199,8 +199,7 @@ SVG_getplotsize($)
sub
SVG_isEmbed($)
{
return (AttrVal($FW_wname, "plotEmbed", 1));
# $FW_userAgent !~ m/(iPhone|iPad|iPod).*OS (8|9)/));
return AttrVal($FW_wname, "plotEmbed", 0);
}
sub
@ -222,16 +221,13 @@ SVG_FwFn($$$$)
my $hash = $defs{$d};
my $ret = "";
if(!$pageHash || !$pageHash->{jsLoaded}) {
$ret .= "<script type='text/javascript' src='$FW_ME/pgm2/svg.js'></script>";
$pageHash->{jsLoaded} = 1 if($pageHash);
}
my $isFirst = (!$pageHash || !$pageHash->{index} || $pageHash->{index} == 1);
$ret .= "<script type='text/javascript' src='$FW_ME/pgm2/svg.js'></script>"
if($isFirst);
# plots navigation buttons
my $pm = AttrVal($d,"plotmode",$FW_plotmode);
if((!$pageHash || !$pageHash->{buttons}) &&
AttrVal($d, "fixedrange", "x") !~ m/^[ 0-9:-]*$/) {
if($isFirst) {
$ret .= '<div class="SVGlabel" data-name="svgZoomControl">';
$ret .= SVG_zoomLink("zoom=-1", "Zoom-in", "zoom in");
$ret .= SVG_zoomLink("zoom=1", "Zoom-out","zoom out");
@ -243,34 +239,6 @@ SVG_FwFn($$$$)
}
if($pm eq "jsSVG") {
my @d=split(":",$defs{$d}{DEF});
my ($err, @svgplotfile) = FileRead("$FW_gplotdir/$d[1].gplot");
($err, @svgplotfile) = FileRead("$FW_gplotdir/template.gplot") if($err);
my $gplot = join("&#01;", @svgplotfile);
$gplot =~ s/'/&#39;/g;
my %webattrflt = ( endPlotNow=>1, endPlotToday=>1, plotmode=>1,
plotsize=>1, nrAxis=>1, stylesheetPrefix=>1 );
if(!$pageHash || !$pageHash->{jssvgLoaded}) {
$ret .=
"<script type='text/javascript' src='$FW_ME/pgm2/jsSVG.js'></script>";
$pageHash->{jssvgLoaded} = 1 if($pageHash);
}
SVG_calcOffsets($d[0], $d);
$ret .= "<div id='jsSVG_$d' class='jsSVG' ".
"data-webAttr='".jsSVG_getAttrs($FW_wname, \%webattrflt)."' ".
"data-svgAttr='".jsSVG_getAttrs($d)."' ".
"data-svgName='".$d."' ".
"data-from='".$SVG_devs{$d[0]}{from}."' ".
"data-to='" .$SVG_devs{$d[0]}{to} ."' ".
"data-gplotFile='$gplot' source='$d[0]'>".
"</div>";
$ret .= (SVG_PEdit($FW_wname,$d,$room,$pageHash) . "<br>")
if(!$pageHash);
return $ret;
}
my $arg="$FW_ME/SVG_showLog?dev=$d".
"&logdev=$hash->{LOGDEVICE}".
"&gplotfile=$hash->{GPLOTFILE}".

View File

@ -122,7 +122,7 @@ BlockingStart(;$)
BC_searchTelnet($curr && $curr->{fn} ? $curr->{fn}: "BlockingStart");
my $chld_alive = 0;
my $max = AttrVal('global', 'blockingCallMax', 0);
my $max = AttrVal('global', 'blockingCallMax', 32);
for my $bpid (sort { $a <=> $b} keys %BC_hash) {
my $h = $BC_hash{$bpid};
@ -131,7 +131,7 @@ BlockingStart(;$)
if($^O =~ m/Win/) {
# MaxNr of concurrent forked processes @Win is 64, and must use wait as
# $SIG{CHLD} = 'IGNORE' does not work.
wait if(!$h->{telnet} || !$defs{$h->{telnet}});
wait if($h->{terminated});
} else {
use POSIX ":sys_wait_h";
waitpid(-1, WNOHANG); # Forum #58867

View File

@ -30,7 +30,7 @@ TcpServer_Open($$$)
Domain => ($hash->{IPV6} ? AF_INET6() : AF_UNSPEC), # Linux bug
LocalHost => $lh,
LocalPort => $port,
Listen => 10,
Listen => 32, # For Windows
Blocking => ($^O =~ /Win/ ? 1 : 0), # Needed for .WRITEBUFFER@darwin
ReuseAddr => 1
);

View File

@ -1,30 +1,30 @@
#Sun Jan 4 16:24:11 2015
#Sun Jul 15 15:31:10 2018
{
'lcCinema' => {
'AllOff' => {
'Screen' => 'up',
'ReadingLight' => 'off',
'Projector' => 'off',
'CeilingLight' => 'off',
'TV' => 'off'
},
'Break' => {
'CeilingLight' => 'dim37%',
'ReadingLight' => 'dim37%'
'ReadingLight' => 'dim37%',
'CeilingLight' => 'dim37%'
},
'Cinema' => {
'CeilingLight' => 'off',
'Projector' => 'on',
'TV' => 'off',
'Screen' => 'down',
'ReadingLight' => 'off',
'TV' => 'off'
'Projector' => 'on'
},
'WatchTV' => {
'CeilingLight' => 'off',
'Projector' => 'off',
'Screen' => 'up',
'ReadingLight' => 'dim12%',
'Projector' => 'off',
'CeilingLight' => 'off',
'TV' => 'on'
},
'AllOff' => {
'CeilingLight' => 'off',
'Projector' => 'off',
'Screen' => 'up',
'ReadingLight' => 'off',
'TV' => 'off'
}
}
}
}

View File

@ -1,4 +1,4 @@
#Sun Jan 4 16:24:11 2015
#Sun Jul 15 15:31:10 2018
setstate Alarm on
setstate Alarm 2015-01-04 16:22:21 state on
setstate AllLights on
@ -6,10 +6,11 @@ setstate AllLights 2015-01-04 16:22:04 LastDevice Alarm
setstate AllLights 2015-01-04 16:22:04 LastDevice_Abs Alarm
setstate AllLights 2015-01-04 16:22:04 state undefined
setstate AllResidentsAway active
setstate AllResidentsAway 2018-07-15 15:27:23 state active
setstate CT off
setstate CT 2015-01-03 01:10:50 ct 3703
setstate CT 2015-01-04 13:30:52 lastCmd off
setstate CT 2015-01-04 16:22:04 state off
setstate CT 2018-07-15 15:27:23 state off
setstate CeilingLight dim0%
setstate CeilingLight 2015-01-04 16:22:40 state off
setstate Cellar T: 21.1 H: 54.6
@ -30,7 +31,7 @@ setstate Garden 2013-08-13 15:03:17 israining no
setstate Garden 2013-08-13 15:03:17 rain 81.9
setstate Garden 2013-08-13 15:03:17 rain_raw 321
setstate Garden 2013-08-13 15:03:17 rain_raw_adj 321
setstate Garden 2015-01-04 16:19:04 state defined
setstate Garden 2018-07-15 15:27:23 state defined
setstate Garden 2013-08-13 15:03:17 temperature 18.3
setstate Garden 2013-08-13 15:03:17 tsecs 1376805797
setstate Garden 2013-08-13 15:03:17 unknown1 a
@ -42,6 +43,7 @@ setstate Livingroom 2015-01-04 16:22:21 state on
setstate Log.Cellar active
setstate Log.Dewpoint active
setstate Log.Garden active
setstate Log.Predicted active
setstate Logfile active
setstate Office on
setstate Office 2015-01-04 16:22:21 state on
@ -53,32 +55,33 @@ setstate RGB off
setstate RGB 2015-01-04 12:55:47 hue 220
setstate RGB 2015-01-04 13:30:54 lastCmd off
setstate RGB 2015-01-04 12:55:47 rgb 0054FF
setstate RGB 2015-01-04 16:22:04 state off
setstate RGB 2018-07-15 15:27:23 state off
setstate ReadingLight dim0%
setstate ReadingLight 2015-01-04 16:22:40 state off
setstate ResidentsComeHome active
setstate ResidentsComeHome 2018-07-15 15:27:23 state active
setstate SVG_01_Garden initialized
setstate SVG_02_Cellar initialized
setstate SVG_03_Dewpoint initialized
setstate SVG_04_Sun initialized
setstate SVG_05_Polar initialized
setstate Screen up
setstate Screen 2015-01-04 16:22:40 state up
setstate TV off
setstate TV 2015-01-04 16:22:40 state off
setstate anyViews 2015-01-04 16:24:11 lockstate 0
setstate anyViews 2015-01-04 16:19:04 state Initialized
setstate anyViews_weblink initialized
setstate Weather.weblink initialized
setstate autocreate active
setstate colorInit 2015-01-04 16:19:04
setstate colorInit 2018-07-15 15:27:23
setstate colorInit 2018-07-15 15:27:23 state active
setstate dew_all active
setstate eventTypes active
setstate global <no definition>
setstate lcCinema AllOff
setstate global no definition
setstate lcCinema 2015-01-04 16:22:40 state AllOff
setstate outdoorNotifier 2015-01-04 16:22:21
setstate outdoorNotifier active
setstate outdoorNotifier 2018-07-15 15:27:23 state active
setstate rg_Guest1 none
setstate rg_Guest1 2015-01-04 16:19:19 durTimerAbsence 00:00:00
setstate rg_Guest1 2015-01-04 16:19:19 durTimerAbsence_cr 0
setstate rg_Guest1 2018-07-15 15:30:38 durTimerAbsence 38640:21:18
setstate rg_Guest1 2018-07-15 15:30:38 durTimerAbsence_cr 2318421
setstate rg_Guest1 2015-01-04 16:19:19 durTimerPresence 00:00:00
setstate rg_Guest1 2015-01-04 16:19:19 durTimerPresence_cr 0
setstate rg_Guest1 2015-01-04 16:19:19 durTimerSleep 00:00:00
@ -99,8 +102,8 @@ setstate rg_Guest1 2014-02-16 14:09:20 presence absent
setstate rg_Guest1 2014-02-16 14:09:20 state none
setstate rg_Guest1 2014-02-15 16:16:27 wayhome 0
setstate rg_Guest2 none
setstate rg_Guest2 2015-01-04 16:19:19 durTimerAbsence 00:00:00
setstate rg_Guest2 2015-01-04 16:19:19 durTimerAbsence_cr 0
setstate rg_Guest2 2018-07-15 15:30:38 durTimerAbsence 38640:29:53
setstate rg_Guest2 2018-07-15 15:30:38 durTimerAbsence_cr 2318430
setstate rg_Guest2 2015-01-04 16:19:19 durTimerPresence 00:00:00
setstate rg_Guest2 2015-01-04 16:19:19 durTimerPresence_cr 0
setstate rg_Guest2 2015-01-04 16:19:19 durTimerSleep 00:00:00
@ -121,6 +124,12 @@ setstate rg_Guest2 2014-02-16 14:00:46 presence absent
setstate rg_Guest2 2014-02-16 14:01:22 state none
setstate rg_Guest2 2014-02-15 16:16:29 wayhome 0
setstate rgr_Children home
setstate rgr_Children 2018-07-15 15:19:54 durTimerAbsence 00:00:00
setstate rgr_Children 2018-07-15 15:19:54 durTimerAbsence_cr 0
setstate rgr_Children 2018-07-15 15:30:38 durTimerPresence 38639:59:33
setstate rgr_Children 2018-07-15 15:30:38 durTimerPresence_cr 2318400
setstate rgr_Children 2018-07-15 15:19:54 durTimerSleep 00:00:00
setstate rgr_Children 2018-07-15 15:19:54 durTimerSleep_cr 0
setstate rgr_Children 2015-01-04 16:19:19 lastActivity gone
setstate rgr_Children 2015-01-04 16:19:19 lastActivityBy Son
setstate rgr_Children 2014-02-16 14:31:05 lastArrival 2014-02-16 14:31:05
@ -145,6 +154,12 @@ setstate rgr_Children 2014-02-16 14:58:01 residentsTotalPresent 1
setstate rgr_Children 2014-02-15 16:16:25 residentsTotalWayhome 0
setstate rgr_Children 2014-02-17 20:45:12 state home
setstate rgr_Guests none
setstate rgr_Guests 2018-07-15 15:30:38 durTimerAbsence 38640:21:18
setstate rgr_Guests 2018-07-15 15:30:38 durTimerAbsence_cr 2318421
setstate rgr_Guests 2018-07-15 15:19:54 durTimerPresence 00:00:00
setstate rgr_Guests 2018-07-15 15:19:54 durTimerPresence_cr 0
setstate rgr_Guests 2018-07-15 15:19:54 durTimerSleep 00:00:00
setstate rgr_Guests 2018-07-15 15:19:54 durTimerSleep_cr 0
setstate rgr_Guests 2014-02-16 14:09:20 lastActivity none
setstate rgr_Guests 2014-02-16 14:09:20 lastActivityBy Guests
setstate rgr_Guests 2014-02-16 14:09:17 lastArrival 2014-02-16 14:09:17
@ -166,6 +181,12 @@ setstate rgr_Guests 2014-02-16 14:09:20 residentsTotalPresent 0
setstate rgr_Guests 2014-02-15 16:16:27 residentsTotalWayhome 0
setstate rgr_Guests 2014-02-16 14:09:20 state none
setstate rgr_Parents home
setstate rgr_Parents 2018-07-15 15:19:54 durTimerAbsence 00:00:00
setstate rgr_Parents 2018-07-15 15:19:54 durTimerAbsence_cr 0
setstate rgr_Parents 2018-07-15 15:30:38 durTimerPresence 38640:14:21
setstate rgr_Parents 2018-07-15 15:30:38 durTimerPresence_cr 2318414
setstate rgr_Parents 2018-07-15 15:19:54 durTimerSleep 00:00:00
setstate rgr_Parents 2018-07-15 15:19:54 durTimerSleep_cr 0
setstate rgr_Parents 2015-01-04 16:19:19 lastActivity gone
setstate rgr_Parents 2015-01-04 16:19:19 lastActivityBy Father
setstate rgr_Parents 2014-02-16 14:16:17 lastArrival 2014-02-16 14:16:17
@ -190,6 +211,12 @@ setstate rgr_Parents 2014-02-16 14:26:52 residentsTotalPresent 1
setstate rgr_Parents 2014-02-15 16:13:39 residentsTotalWayhome 0
setstate rgr_Parents 2014-02-16 14:16:17 state home
setstate rgr_Residents home
setstate rgr_Residents 2018-07-15 15:19:54 durTimerAbsence 00:00:00
setstate rgr_Residents 2018-07-15 15:19:54 durTimerAbsence_cr 0
setstate rgr_Residents 2018-07-15 15:30:38 durTimerPresence 38640:14:21
setstate rgr_Residents 2018-07-15 15:30:38 durTimerPresence_cr 2318414
setstate rgr_Residents 2018-07-15 15:19:54 durTimerSleep 00:00:00
setstate rgr_Residents 2018-07-15 15:19:54 durTimerSleep_cr 0
setstate rgr_Residents 2015-01-04 16:19:19 lastActivity gone
setstate rgr_Residents 2015-01-04 16:19:19 lastActivityBy Son
setstate rgr_Residents 2014-02-16 14:16:17 lastArrival 2014-02-16 14:16:17
@ -216,8 +243,8 @@ setstate rgr_Residents 2014-02-16 14:16:17 state home
setstate rr_Baby home
setstate rr_Baby 2015-01-04 16:19:19 durTimerAbsence 00:00:00
setstate rr_Baby 2015-01-04 16:19:19 durTimerAbsence_cr 0
setstate rr_Baby 2015-01-04 16:23:19 durTimerPresence 7729:52:58
setstate rr_Baby 2015-01-04 16:23:19 durTimerPresence_cr 463793
setstate rr_Baby 2018-07-15 15:30:38 durTimerPresence 38640:00:17
setstate rr_Baby 2018-07-15 15:30:38 durTimerPresence_cr 2318400
setstate rr_Baby 2015-01-04 16:19:19 durTimerSleep 00:00:00
setstate rr_Baby 2015-01-04 16:19:19 durTimerSleep_cr 0
setstate rr_Baby 2014-02-16 14:30:21 lastArrival 2014-02-16 14:30:21
@ -234,8 +261,8 @@ setstate rr_Baby 2014-02-16 14:30:21 presence present
setstate rr_Baby 2014-02-17 20:45:12 state home
setstate rr_Baby 2014-02-16 14:30:21 wayhome 0
setstate rr_Daughter gone
setstate rr_Daughter 2015-01-04 16:23:19 durTimerAbsence 7729:25:20
setstate rr_Daughter 2015-01-04 16:23:19 durTimerAbsence_cr 463765
setstate rr_Daughter 2018-07-15 15:30:38 durTimerAbsence 38639:32:39
setstate rr_Daughter 2018-07-15 15:30:38 durTimerAbsence_cr 2318373
setstate rr_Daughter 2015-01-04 16:19:19 durTimerPresence 00:00:00
setstate rr_Daughter 2015-01-04 16:19:19 durTimerPresence_cr 0
setstate rr_Daughter 2015-01-04 16:19:19 durTimerSleep 00:00:00
@ -256,8 +283,8 @@ setstate rr_Daughter 2014-02-16 14:57:59 presence absent
setstate rr_Daughter 2015-01-04 16:19:19 state gone
setstate rr_Daughter 2014-02-16 13:46:26 wayhome 0
setstate rr_Father gone
setstate rr_Father 2015-01-04 16:23:19 durTimerAbsence 7729:56:27
setstate rr_Father 2015-01-04 16:23:19 durTimerAbsence_cr 463796
setstate rr_Father 2018-07-15 15:30:38 durTimerAbsence 38640:03:46
setstate rr_Father 2018-07-15 15:30:38 durTimerAbsence_cr 2318404
setstate rr_Father 2015-01-04 16:19:19 durTimerPresence 00:00:00
setstate rr_Father 2015-01-04 16:19:19 durTimerPresence_cr 0
setstate rr_Father 2015-01-04 16:19:19 durTimerSleep 00:00:00
@ -277,8 +304,8 @@ setstate rr_Father 2014-02-16 13:46:02 wayhome 0
setstate rr_Mother home
setstate rr_Mother 2015-01-04 16:19:19 durTimerAbsence 00:00:00
setstate rr_Mother 2015-01-04 16:19:19 durTimerAbsence_cr 0
setstate rr_Mother 2015-01-04 16:23:19 durTimerPresence 7730:07:02
setstate rr_Mother 2015-01-04 16:23:19 durTimerPresence_cr 463807
setstate rr_Mother 2018-07-15 15:30:38 durTimerPresence 38640:14:21
setstate rr_Mother 2018-07-15 15:30:38 durTimerPresence_cr 2318414
setstate rr_Mother 2015-01-04 16:19:19 durTimerSleep 00:00:00
setstate rr_Mother 2015-01-04 16:19:19 durTimerSleep_cr 0
setstate rr_Mother 2014-02-16 14:16:17 lastArrival 2014-02-16 14:16:17
@ -294,8 +321,8 @@ setstate rr_Mother 2014-02-16 14:16:17 presence present
setstate rr_Mother 2014-02-16 14:16:17 state home
setstate rr_Mother 2014-02-16 13:46:09 wayhome 0
setstate rr_Son gone
setstate rr_Son 2015-01-04 16:23:19 durTimerAbsence 7729:25:18
setstate rr_Son 2015-01-04 16:23:19 durTimerAbsence_cr 463765
setstate rr_Son 2018-07-15 15:30:38 durTimerAbsence 38639:32:37
setstate rr_Son 2018-07-15 15:30:38 durTimerAbsence_cr 2318373
setstate rr_Son 2015-01-04 16:19:19 durTimerPresence 00:00:00
setstate rr_Son 2015-01-04 16:19:19 durTimerPresence_cr 0
setstate rr_Son 2015-01-04 16:19:19 durTimerSleep 00:00:00
@ -315,6 +342,8 @@ setstate rr_Son 2014-02-16 14:58:01 mood -
setstate rr_Son 2014-02-16 14:58:01 presence absent
setstate rr_Son 2015-01-04 16:19:19 state gone
setstate rr_Son 2014-02-16 13:46:38 wayhome 0
setstate sunRise Next: 07:45:49
setstate sunSet Next: 17:14:06
setstate sunRise Next: 04:50:28
setstate sunRise 2018-07-15 15:27:23 state Next: 04:50:28
setstate sunSet Next: 22:12:30
setstate sunSet 2018-07-15 15:27:23 state Next: 22:12:30
setstate wlCinema initialized

View File

@ -1,15 +1,16 @@
attr global userattr devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd widgetOverride
attr global userattr cmdIcon devStateIcon devStateStyle icon lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0 sortby structexclude webCmd webCmdLabel:textField-long widgetOverride
attr global autoload_undefined_devices 1
attr global autosave 0
attr global backup_before_update 0
attr global logfile -
attr global modpath .
attr global motd FHEM demo version
attr global motd
attr global mseclog 1
attr global room System
attr global sendStatistics never
attr global statefile ./demolog/fhem.save
attr global updateInBackground 1
attr global verbose 3
attr global mseclog
define telnetPort telnet 7072 global
attr telnetPort room System
@ -17,26 +18,197 @@ attr telnetPort room System
define WEB FHEMWEB 8083 global
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB defaultRoom Light
attr WEB hiddenroom DashboardRoom
attr WEB iconPath openautomation:fhemSVG:default
attr WEB room System
attr WEB sortRooms Light Cinema Residents Sensors System
define WEBphone FHEMWEB 8084 global
attr WEBphone hiddenroom DashboardRoom
attr WEBphone iconPath openautomation:fhemSVG:default
attr WEBphone room System
attr WEBphone sortRooms Light Cinema Residents Sensors System
attr WEBphone smallscreenCommands 1
attr WEBphone stylesheetPrefix smallscreen
define WEBtablet FHEMWEB 8085 global
attr WEBtablet hiddenroom DashboardRoom
attr WEBtablet iconPath openautomation:fhemSVG:default
attr WEBtablet room System
attr WEBtablet sortRooms Light Cinema Residents Sensors System
attr WEBtablet stylesheetPrefix ios7touchpad
attr WEB styleData {\
"f18": {\
"Pinned.menu": true,\
"cols.bg": "FFFFE7",\
"cols.fg": "000000",\
"cols.link": "278727",\
"cols.evenrow": "F8F8E0",\
"cols.oddrow": "F0F0D8",\
"cols.header": "E0E0C8",\
"cols.menu": "D7FFFF",\
"cols.sel": "A0FFFF",\
"cols.inpBack": "FFFFFF",\
"savePinChanges": true,\
"fixedInput": true,\
"hidePin": true,\
"showDragger": false,\
"Pos.style_list_Styles": {\
"left": 20,\
"top": 0,\
"width": 240,\
"height": 260,\
"oTop": 20,\
"oLeft": 0\
},\
"Pos.style_list_f18_special": {\
"left": 20,\
"top": 280,\
"width": 240,\
"height": 140,\
"oTop": 40,\
"oLeft": 0\
},\
"Pos.style_list_f18__Room_specific": {\
"left": 280,\
"top": -20,\
"width": 240,\
"height": 400,\
"oTop": 40,\
"oLeft": 0\
},\
"Pos.Room_Light_grp_Color_Lights": {\
"left": 0,\
"top": 0,\
"width": 860,\
"height": 80,\
"oTop": 21,\
"oLeft": 1\
},\
"Pos.Room_Light_grp_Notify": {\
"left": 420,\
"top": 300,\
"width": 440,\
"height": 38,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Light_grp_Single_Lights": {\
"left": 0,\
"top": 100,\
"width": 400,\
"height": 240,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Light_grp_Structure": {\
"left": 420,\
"top": 220,\
"width": 440,\
"height": 38,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Light_grp_Timer": {\
"left": 420,\
"top": 100,\
"width": 440,\
"height": 78,\
"oTop": 41,\
"oLeft": 1\
},\
"snapToGrid": true,\
"Pos.Room_Cinema_grp_AV": {\
"left": 0,\
"top": 0,\
"width": 560,\
"height": 120,\
"oTop": 21,\
"oLeft": 1\
},\
"Pos.Room_Cinema_grp_Control": {\
"left": 0,\
"top": 140,\
"width": 560,\
"height": 40,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Cinema_grp_Light": {\
"left": 0,\
"top": 220,\
"width": 560,\
"height": 78,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Cinema_grp_Scenes": {\
"left": 0,\
"top": 360,\
"width": 560,\
"height": 180,\
"oTop": 24,\
"oLeft": 0\
},\
"Pos.Room_Sensors_grp_FileLog": {\
"left": 0,\
"top": 0,\
"width": 260,\
"height": 120,\
"oTop": 21,\
"oLeft": 1\
},\
"Pos.Room_Sensors_grp_Helper": {\
"left": 0,\
"top": 140,\
"width": 260,\
"height": 20,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.Room_Sensors_grp_Sensors": {\
"left": 0,\
"top": 200,\
"width": 260,\
"height": 40,\
"oTop": 41,\
"oLeft": 1\
},\
"Pos.svgZoomControl": {\
"left": 0,\
"top": 300,\
"width": 1040,\
"height": 0,\
"oTop": 0,\
"oLeft": 0\
},\
"Pos.SVG_01_Garden": {\
"left": 0,\
"top": 500,\
"width": 1040,\
"height": 180,\
"oTop": -164,\
"oLeft": 0\
},\
"Pos.SVG_02_Cellar": {\
"left": 0,\
"top": 680,\
"width": 1040,\
"height": 180,\
"oTop": -164,\
"oLeft": 0\
},\
"Pos.SVG_03_Dewpoint": {\
"left": 0,\
"top": 860,\
"width": 1040,\
"height": 180,\
"oTop": -164,\
"oLeft": 0\
},\
"Pos.SVG_04_Sun": {\
"left": 0,\
"top": 1040,\
"width": 1040,\
"height": 180,\
"oTop": -164,\
"oLeft": 0\
},\
"Pos.SVG_05_Polar": {\
"left": 280,\
"top": 300,\
"width": 1040,\
"height": 320,\
"oTop": -304,\
"oLeft": 0\
}\
}\
}
attr WEB stylesheetPrefix f18
# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog
@ -121,12 +293,12 @@ attr SVG_03_Dewpoint startDate 2013-08-13
define logProxy logProxy
attr logProxy room System
define SVG_04_Sun SVG logProxy:SVG_04_Sun:CURRENT
attr SVG_04_Sun room Sensors
attr SVG_04_Sun fixedrange year
attr SVG_04_Sun room Sensors
attr SVG_04_Sun title {"".logProxy_dec2hms($data{min1})." - ".logProxy_dec2hms($data{max1})." - ".logProxy_dec2hms($data{min2})." - ".logProxy_dec2hms($data{max2})}
define SVG_05_Polar SVG logProxy:SVG_05_Polar:CURRENT
attr SVG_05_Polar room Sensors
attr SVG_05_Polar plotsize 340,300
attr SVG_05_Polar room Sensors
define sunRise at *{sunrise()} set Office on
attr sunRise group Timer
@ -189,20 +361,6 @@ attr lcCinema icon scene_scene
attr lcCinema room Cinema
attr lcCinema webCmd scene
define anyViews Dashboard
attr anyViews userattr dashboard_tab2backgroundimage dashboard_tab2colcount dashboard_tab2devices dashboard_tab2groups dashboard_tab2icon dashboard_tab2name dashboard_tab2rowcentercolwidth dashboard_tab2sorting
attr anyViews dashboard_colcount 2
attr anyViews dashboard_row center
attr anyViews dashboard_rowcentercolwidth 50%
attr anyViews dashboard_tab1groups Home State,Light,AV,Single Lights,Color Lights
attr anyViews dashboard_tab1name Dashboard Demo
attr anyViews dashboard_tab1sorting t0c0,Single Lights,true,400,209,0,0:t0c0,AV,true,400,170,0,209:t0c1,Light,true,444,129,h84,0:t0c1,Home State,true,444,204,384,129:
attr anyViews room hidden
attr anyViews alias Dashboard Demo
define anyViews_weblink weblink htmlCode {DashboardAsHtml("anyViews")}
attr anyViews_weblink room DashboardRoom
define rgr_Residents RESIDENTS
attr rgr_Residents alias Residents
attr rgr_Residents devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home
@ -329,21 +487,7 @@ attr CT setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem
attr CT setList on:noArg off:noArg ct:colorpicker,CT,2000,1,6500
attr CT webCmd ct::ct 2040:ct 2630:ct 3703:ct 6250:on:off
define -ignoreErr Weather Weather 673513 1800 de
attr Weather group Weather
attr Weather room Weather
define Weather.weblink weblink htmlCode { WeatherAsHtmlH("Weather") }
attr Weather.weblink alias Weather Forecast
attr Weather.weblink room Weather
define -ignoreErr Display RSS jpg localhost ./demolog/layout
attr Display room System
attr Display size 800x600
attr Display bg ./demolog/pictures
attr Display tmin 15
attr Display refresh 5
define rg readingsGroup TYPE=FHEMWEB
attr rg comment Workaround for the dashboard bug.
attr rg room hidden

View File

@ -397,12 +397,12 @@ f18_resize()
hi = f18_getAttr("hideInput"),
pm = f18_getAttr("Pinned.menu");
var diff = 0;
diff += hl ? 0 : 40;
diff += pm ? 0 : 44;
$("input.maininput")
.css("width", (w-(FW_isiOS ? 40 : 30)-diff)+'px')
.css("display", hi ? "none":"block");
var left = 0;
left += hl ? 0 : 40;
left += pm ? 0 : 44;
$("input.maininput").css({ width:(w-left-(FW_isiOS ? 30 : 20))+'px',
display: hi ? "none":"block"});
$("#hdr").css({ left:left+'px' });
$("#menu,#content").css("top", (hi && pm && hl) ? "10px" : "50px");
}

View File

@ -5,13 +5,14 @@ textarea, .ui-dialog.ui-widget textarea { font-family:Courier; }
input,textarea { border-style:ridge; }
#logo {
position:fixed; top:10px; left:52px; width:32px; height:32px; z-index:10;
position:absolute; top:10px; left:52px; width:32px; height:32px; z-index:10;
background-image:url(../images/default/fhemicon.png);
background-size: contain; background-repeat: no-repeat;
}
#menuBtn { top:10px; left:10px; width:32px; height:32px; }
#hdr { top:10px; right:10px; }
#content { top:50px; left:10px; bottom:10px; right:10px; }
#hdr { position:absolute; top:10px; left:48px; }
#content { position:absolute; top:50px; left:10px; bottom:10px; right:10px; }
body.small #content { left:10px; }
#menu {
top:50px; bottom:10px; left:-120%;
z-index:20;