diff --git a/fhem/FHEM/98_DOIF.pm b/fhem/FHEM/98_DOIF.pm index ef6a44192..50fc4f3ea 100644 --- a/fhem/FHEM/98_DOIF.pm +++ b/fhem/FHEM/98_DOIF.pm @@ -4292,24 +4292,32 @@ sub format_value { sub bar { - my ($val,$min,$max,$header,$minColor,$maxColor,$unit,$bwidth,$bheight,$size,$func,$dec) = @_; + my ($val,$min,$max,$header,$minColor,$maxColor,$unit,$bwidth,$bheight,$size,$func,$dec,$model,$lr,$ln,$icon) = @_; my $out; my $trans=0; my ($format,$value); + my ($ic,$iscale,$ix,$iy); + my $minCol=$minColor; + + if (defined $lr) { + if (!defined $ln) { + $ln=$lr; + } + } $unit="" if (!defined $unit); - $bheight=70 if (!defined $bheight); + $bheight=60 if (!defined $bheight); my $height=$bheight-10; if (!defined $header or $header eq "") { $trans = -1; } else { - $bwidth= 75 if (!defined $bwidth); + $bwidth= 60 if (!defined $bwidth); $trans = 13; $bheight += 13; } - $bwidth=75 if (!defined $bwidth); + $bwidth=60 if (!defined $bwidth); $min=0 if (!defined $min); $max=100 if (!defined $max); @@ -4324,6 +4332,7 @@ sub bar $minColor=120 if (!defined $minColor); $maxColor=0 if (!defined $maxColor); } + $minCol=$minColor; $max=$value if($value>$max); $min=$value if ($value<$min); $size=100 if (!defined $size); @@ -4334,22 +4343,45 @@ sub bar my $currColor; if (defined $func) { + if (defined($model)) { + $minColor=&{$func}($value); + } $currColor=&{$func}($value); } else { if ($minColor < $maxColor) { - $currColor=$prop*($maxColor-$minColor); + $currColor=$prop*($maxColor-$minColor)+$minColor; } else { - $currColor=(1-$prop)*($minColor-$maxColor); + $currColor=(1-$prop)*($minColor-$maxColor)+$maxColor; + } + if (defined($model)) { + $minColor=$currColor; } } + + if (defined ($icon)) { + ($ic,$iscale,$ix,$iy,)=split(",",$icon); + if (defined ($ix)) { + $ix+=$bwidth/2+5; + } else { + $ix=$bwidth/2+5; + }; + if (defined ($iy)) { + $iy+=($height/2-12); + } else { + $iy=($height/2-12); + }; + $iscale=1 if (!defined($iscale)); + } + + $out.= sprintf ('',$bwidth,$bheight,$size/100*$bwidth,$size/100*$bheight); $out.= ''; $out.= ''; - $out.= ''; + $out.= ''; $out.= ''; - $out.= sprintf('',$currColor,$minColor,color($currColor),color($minColor)); + $out.= sprintf('',$currColor,$minColor,(defined $lr ? $lr:-1),color($currColor,$lr),color($minColor,$lr)); $out.= ''; - $out.= sprintf('',$bwidth,$bheight); + $out.= sprintf('',$bwidth-2,$bheight); $out.= sprintf('%s',$bwidth/2+10,$header) if (defined $header and $header ne ""); $out.= sprintf('',$trans); my $nullColor; @@ -4367,14 +4399,25 @@ sub bar } } - $out.= sprintf('%d',color($maxColor),$max); - $out.= sprintf('%d',$height+6,color($minColor),$min); - $out.= sprintf('',$y,$val1,$currColor,$minColor); - $out.= sprintf('',$height); - $out.= sprintf('',$height); - $out.= sprintf('',$null,$null) if ($min < 0 and $max > 0);; + $ic="$ic\@".color($currColor,$ln) if (defined($icon) and $icon !~ /@/); - $out.= sprintf('%s%s',$bwidth+6, $height/2+13,color($currColor),sprintf($format,$val),$unit); + $out.= sprintf('%s',color($maxColor,$ln),sprintf($format,$max)); + $out.= sprintf('%s',$height+9,color($minCol,$ln),sprintf($format,$min)); + $out.= sprintf('',$y,$val1,$currColor,$minColor,(defined $lr ? $lr:-1)); + $out.= sprintf('',$height); + ##$out.= sprintf('',$height); + $out.= sprintf('',$null,$null) if ($min < 0 and $max > 0);; + + if (defined $icon and $icon ne "") { + $out.=''; + $out.= ::FW_makeImage($ic); + $out.=''; + ##$out.=''; + $out.='';#height="18" width="18" + ##$out.=''; + } + + $out.= sprintf('%s%s',$bwidth+6,(defined ($icon) ? $height/2+23:$height/2+13),color($currColor,$ln),sprintf($format,$val),$unit); $out.= ''; $out.= ''; @@ -4382,19 +4425,67 @@ return ($out); } sub temp_bar { - my ($value,$min,$max,$header,$width,$height,$size) = @_; + my ($value,$min,$max,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; $min=-20 if (!defined $min or $min eq ""); $max=60 if (!defined $max or $max eq ""); - return(bar($value,$min,$max,$header,undef,undef,"°C",$width,$height,$size,\&temp_hue,1)); + return(bar($value,$min,$max,$header,undef,undef,"°C",$width,$height,$size,\&temp_hue,1,undef,$lightbar,$lightnumber)); } +sub temp_mbar { + my ($value,$min,$max,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; + $min=-20 if (!defined $min or $min eq ""); + $max=60 if (!defined $max or $max eq ""); + return(bar($value,$min,$max,$header,undef,undef,"°C",$width,$height,$size,\&temp_hue,1,1,$lightbar,$lightnumber)); +} + +sub icon_temp_bar { + my ($icon,$value,$min,$max,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; + $min=-20 if (!defined $min or $min eq ""); + $max=60 if (!defined $max or $max eq ""); + return(bar($value,$min,$max,$header,undef,undef,"°C",$width,$height,$size,\&temp_hue,1,undef,$lightbar,$lightnumber,$icon)); +} + +sub icon_temp_mbar { + my ($icon,$value,$min,$max,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; + $min=-20 if (!defined $min or $min eq ""); + $max=60 if (!defined $max or $max eq ""); + return(bar($value,$min,$max,$header,undef,undef,"°C",$width,$height,$size,\&temp_hue,1,1,$lightbar,$lightnumber,$icon)); +} + + sub hum_bar { - my ($value,$header,$width,$height,$size) = @_; - - $width=60 if (!defined $width); - return(bar($value,0,100,$header,undef,undef,"%",$width,$height,$size,\&hum_hue,0)); + my ($value,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; +## $width=50 if (!defined $width); + return(bar($value,0,100,$header,undef,undef,"%",$width,$height,$size,\&hum_hue,0,undef,$lightbar,$lightnumber)); } +sub hum_mbar { + my ($value,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; +## $width=50 if (!defined $width); + return(bar($value,0,100,$header,undef,undef,"%",$width,$height,$size,\&hum_hue,0,1,$lightbar,$lightnumber)); +} + +sub icon_hum_bar { + my ($icon,$value,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; +## $width=50 if (!defined $width); + return(bar($value,0,100,$header,undef,undef,"%",$width,$height,$size,\&hum_hue,0,undef,$lightbar,$lightnumber,$icon)); +} + +sub icon_hum_mbar { + my ($icon,$value,$header,$width,$height,$size,$lightbar,$lightnumber) = @_; +## $width=50 if (!defined $width); + return(bar($value,0,100,$header,undef,undef,"%",$width,$height,$size,\&hum_hue,0,1,$lightbar,$lightnumber,$icon)); +} + +sub icon_bar { + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$dec,$header,$bwidth,$bheight,$size,$func,$lr,$ln) = @_; + return (bar($val,$min,$max,$header,$minColor,$maxColor,$unit,$bwidth,$bheight,$size,$func,$dec,undef,$lr,$ln,$icon)); +} + +sub icon_mbar { + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$dec,$header,$bwidth,$bheight,$size,$func,$lr,$ln) = @_; + return (bar($val,$min,$max,$header,$minColor,$maxColor,$unit,$bwidth,$bheight,$size,$func,$dec,1,$lr,$ln,$icon)); +} sub polarToCartesian { my ($centerX,$centerY,$radius,$angleInDegrees)=@_; @@ -4432,11 +4523,11 @@ sub color { } sub temp_uring { - my ($value,$min,$max,$size,$type,$lightring,$lightnumber) = @_; + my ($value,$min,$max,$size,$type,$lightring,$lightnumber,$icon) = @_; $min=-20 if (!defined $min); $max=60 if (!defined $max); $size=80 if (!defined $size); - return(ring($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,1,$type,$lightring,$lightnumber)); + return(ring($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,1,$type,$lightring,$lightnumber,$icon)); } sub temp_ring{ @@ -4448,12 +4539,22 @@ sub temp_mring{ my ($value,$min,$max,$size,$lightring,$lightnumber) = @_; return(temp_uring($value,$min,$max,$size,1,$lightring,$lightnumber)); } +sub icon_temp_ring{ + my ($icon,$value,$min,$max,$size,$lightring,$lightnumber) = @_; + $size=100 if (!defined $size); + return(temp_uring($value,$min,$max,$size,undef,$lightring,$lightnumber,$icon)); +} +sub icon_temp_mring{ + my ($icon,$value,$min,$max,$size,$lightring,$lightnumber) = @_; + $size=100 if (!defined $size); + return(temp_uring($value,$min,$max,$size,1,$lightring,$lightnumber,$icon)); +} sub hum_uring { - my ($value,$size,$type,$lightring,$lightnumber) = @_; + my ($value,$size,$type,$lightring,$lightnumber,$icon) = @_; $size=80 if (!defined $size); - return(ring($value,0,100,undef,undef,"%",$size,\&hum_hue,0,$type,$lightring,$lightnumber)); + return(ring($value,0,100,undef,undef,"%",$size,\&hum_hue,0,$type,$lightring,$lightnumber,$icon)); } sub hum_ring{ @@ -4466,6 +4567,18 @@ sub hum_mring{ return(hum_uring($value,$size,1,$lightring,$lightnumber)); } +sub icon_hum_ring{ + my ($icon,$value,$size,$lightring,$lightnumber) = @_; + $size=100 if (!defined $size); + return(hum_uring($value,$size,undef,$lightring,$lightnumber,$icon)); +} + +sub icon_hum_mring{ + my ($icon,$value,$size,$lightring,$lightnumber) = @_; + $size=100 if (!defined $size); + return(hum_uring($value,$size,1,$lightring,$lightnumber,$icon)); +} + sub temp_hum_ring { my ($value,$value2,$min,$max,$size,$lightring,$lightnumber) = @_; $min=-20 if (!defined $min); @@ -4482,17 +4595,50 @@ sub temp_temp_ring { return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,1,$value2,$min,$max,undef,undef,"°C",\&temp_hue,1,$lightring,$lightnumber)); } +sub icon_ring { + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$dec,$size,$func,$lr,$ln) = @_; + return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,undef,$lr,$ln,$icon)); +} + +sub icon_mring { + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$dec,$size,$func,$lr,$ln) = @_; + return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,1,$lr,$ln,$icon,$icon)); +} + +sub mring +{ + my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$lr,$ln) = @_; + return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,1,$lr,$ln)); +} + sub ring { - my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$model,$lr,$ln) = @_; + my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$model,$lr,$ln,$icon) = @_; my $out; + + my ($ic,$iscale,$ix,$iy); + + if (defined ($icon)) { + ($ic,$iscale,$ix,$iy,)=split(",",$icon); + if (defined ($ix)) { + $ix+=29; + } else { + $ix=29; + }; + if (defined ($iy)) { + $iy+=9; + } else { + $iy=9; + }; + $iscale=1 if (!defined($iscale)); + } + my ($format,$value); if (defined $lr) { if (!defined $ln) { $ln=$lr; } } - $min=0 if (!defined $min); $max=100 if (!defined $max); @@ -4529,58 +4675,56 @@ sub ring if (defined($model)) { $minColor=$currColor; } - } - $out.= sprintf('',$size/100*60,$size/100*55); + } + + $ic="$ic\@".color($currColor,$ln) if (defined($icon) and $icon !~ /@/); + + $out.= sprintf('',$size/100*(defined($icon)?61:60),$size/100*(defined($icon)?57:55)); $out.= ''; $out.= ''; $out.= sprintf('\ - ',$currColor,$minColor,(defined $lr ? $lr:-1),$x1,$y1,$x2,$y2,color($currColor,$lr),color($minColor,$lr)); + ',$currColor,$minColor,(defined $lr ? $lr:-1),$x1,$y1,$x2,$y2,color($currColor,$lr),color($minColor,$lr)); - $out.= '\ - '; + $out.= '\ + '; $out.=''; - - $out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 26, 0, 280); - $out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 29, 0, 280); - $out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 23, 0, 280); - $out.=''; - #if (!defined($model)) { - # $out.=sprintf('',color($minColor)); - # $out.=describeArc(40, 30, 26, 0, 10); - # $out.=''; - #} - $out.=''; - $out.=describeArc(40, 30, 26, 0, 1); - $out.=''; - $out.=''; - $out.=describeArc(40, 30, 26, 279, 280); + $out.=''; + $out.=sprintf(''); + $out.=describeArc(40, 30, (defined($icon)?27.5:26.5), 0, 280); $out.=''; + ##$out.=sprintf(''); + ##$out.=describeArc(40, 30, 29, 0, 280); + ##$out.=''; + ##$out.=sprintf(''); + ##$out.=describeArc(40, 30, (defined($icon)?26:23), 0, 280); + ##$out.=''; + ##$out.=''; + ##$out.=describeArc(40, 30, (defined($icon)?27.5:26), 0, 1); + ##$out.=''; + ##$out.=''; + ##$out.=describeArc(40, 30, (defined($icon)?27.5:26), 279, 280); + ##$out.=''; #$out.=sprintf('',color ($maxColor)); #$out.=describeArc(40, 30, 26, 270, 280); #$out.=''; - $out.=sprintf('',$currColor,$minColor,(defined $lr ? $lr:-1)); - $out.=describeArc(40, 30, 26, 0, int($prop*280)); + $out.=sprintf('',$currColor,$minColor,(defined $lr ? $lr:-1)); + $out.=describeArc(40, 30, (defined($icon)?27.5:26.5), 0, int($prop*280)); $out.=''; - - $out.= sprintf('%s',color($currColor,$ln),sprintf($format,$val)); - $out.= sprintf('%s',color($currColor,$ln),$unit) if (defined $unit); + if (defined $icon and $icon ne "") { + $out.=''; + $out.= ::FW_makeImage($ic); + $out.=''; + ##$out.=''; + $out.='';#height="18" width="18" + ##$out.=''; + } + $out.= sprintf('%s',(defined ($icon) ? 43:34),color($currColor,$ln),(defined ($icon) ? 14:18),sprintf($format,$val)); + $out.= sprintf('%s',(defined ($icon) ? 53:47),color($currColor,$ln),$unit) if (defined $unit); $out.= ''; return ($out); } -sub mring -{ - my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$lr,$ln) = @_; - return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,1,$lr,$ln)); -} - sub ring2 { my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$dec2,$lr,$ln) = @_; @@ -4657,49 +4801,49 @@ sub ring2 $out.= ''; $out.= ''; $out.= sprintf('\ - ',$currColor,$minColor,(defined $lr ? $lr:-1),$x1,$y1,$x2,$y2,color($currColor,$lr),color($currColor,$lr)); + ',$currColor,$minColor,(defined $lr ? $lr:-1),$x1,$y1,$x2,$y2,color($currColor,$lr),color($currColor,$lr)); $out.= sprintf('\ - ',$currColor2,$minColor2,(defined $lr ? $lr:-1),$x12,$y12,$x22,$y22,color($currColor2,$lr),color($currColor2,$lr)); + ',$currColor2,$minColor2,(defined $lr ? $lr:-1),$x12,$y12,$x22,$y22,color($currColor2,$lr),color($currColor2,$lr)); - $out.= '\ - '; + $out.= '\ + '; $out.=''; - $out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 25.5, 0, 280); + $out.=''; + $out.=sprintf(''); + $out.=describeArc(40, 29, 25, 0, 280); $out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 28.5, 0, 280); - $out.=''; + ##$out.=sprintf(''); + ##$out.=describeArc(40, 30, 28.5, 0, 280); + ##$out.=''; - $out.=sprintf(''); - $out.=describeArc(40, 30, 22, 0, 280); - $out.=''; + ##$out.=sprintf(''); + ##$out.=describeArc(40, 30, 22, 0, 280); + ##$out.=''; $out.=sprintf('',$currColor,$minColor,(defined $lr ? $lr:-1)); - $out.=describeArc(40, 30, 27, 0, int($prop*280)); + $out.=describeArc(40, 29, 27, 0, int($prop*280)); $out.=''; $out.=sprintf('',$currColor2,$minColor2,(defined $lr ? $lr:-1)); - $out.=describeArc(40, 30, 23.5, 0, int($prop2*280)); - $out.=''; - $out.=''; - $out.=describeArc(40, 30, 25.2, 0, 1.5); + $out.=describeArc(40, 29, 23.5, 0, int($prop2*280)); $out.=''; + ##$out.=''; + ##$out.=describeArc(40, 30, 25.2, 0, 1.5); + ##$out.=''; - $out.=''; - $out.=describeArc(40, 30, 25.2, 279, 280.5); - $out.=''; + ##$out.=''; + ##$out.=describeArc(40, 30, 25.2, 279, 280.5); + ##$out.=''; - $out.= sprintf('%s',color($currColor,$ln),sprintf($format,$val)); - $out.= sprintf('%s',color($currColor,$ln),$unit) if (defined $unit); + $out.= sprintf('%s',color($currColor,$ln),sprintf($format,$val)); + $out.= sprintf('%s',color($currColor,$ln),$unit) if (defined $unit); - $out.= sprintf('%s',color($currColor2,$ln),sprintf($format2,$val2)); - $out.= sprintf('%s',color($currColor2,$ln),$unit2) if (defined $unit2); + $out.= sprintf('%s',color($currColor2,$ln),sprintf($format2,$val2)); + $out.= sprintf('%s',color($currColor2,$ln),$unit2) if (defined $unit2); $out.= ''; return ($out); @@ -4767,13 +4911,14 @@ sub cylinder $dec=1 if (!defined $dec); my $format='%1.'.$dec.'f'; - $height=10+@values*10 if (!defined $height or $height eq ""); - + if (!defined $height or $height eq "") { + $height=10+@values*10 if (!defined $height or $height eq ""); + } if (!defined $header or $header eq "") { $trans=5; $bheight=$height-26; } else { - $trans=21; + $trans=22; $bheight=$height-10; } my $width=30; @@ -4794,13 +4939,13 @@ sub cylinder $out.= ''; for (my $i=0;$i<@values;$i+=3){ my $color=$values[$i+1]; - $out.= sprintf('',$color,hsl_color($color),hsl_color($color)); + $out.= sprintf('',$color,hsl_color($color),hsl_color($color)); } $out.= ''; $out.= ''; - $out.= sprintf('',$bwidth, $bheight+40); - $out.= sprintf('%s',$bwidth/2+11,$header) if ($header ne ""); + $out.= sprintf('',$bwidth-2, $bheight+40); + $out.= sprintf('%s',$bwidth/2+11,$header) if ($header ne ""); $out.= sprintf('',$trans); @@ -4808,9 +4953,9 @@ sub cylinder $out.= sprintf('',$height,$width); $out.= sprintf('',$width); - $out.= sprintf('',$width,$height+4); + ##$out.= sprintf('',$width,$height+4); - $out.= sprintf('',$height,$width); + ##$out.= sprintf('',$height,$width); # $out.= sprintf('',$null,$width) if (defined $null); @@ -4834,18 +4979,19 @@ sub cylinder my $text=$values[$i+2]; ($y,$val1,$null)=y_h($value,$min,$max,$height); + $out.= sprintf('',$y,$width);#,hsl_color($color,0)); $out.= sprintf('',$y,$width,$val1,$color); #$out.= sprintf('',$y,$width); - $out.= sprintf('',$y,$width,hsl_color($color,0)); + if (defined $text and $text ne "") { $out.= sprintf('%s',$yBegin+$i*10,hsl_color($color),$text.":"); $yValue+=7; } - $out.= sprintf('%s%s',$bwidth+5, $yValue+$i*10,hsl_color ($color),($val eq "N/A" ? $val:sprintf($format,$val)),$unit); + $out.= sprintf('%s%s',$bwidth+5, $yValue+$i*10,hsl_color ($color),($val eq "N/A" ? $val:sprintf($format,$val)),$unit); } - $out.= sprintf('',$width); + ##$out.= sprintf('',$width); $out.= ''; $out.= ''; return ($out);