From 140d283c77e40211b50bb79af67911bdaaa9ac4b Mon Sep 17 00:00:00 2001 From: Ellert <> Date: Thu, 12 Oct 2017 16:34:21 +0000 Subject: [PATCH] 98_DOIFtools.pm:add getter linearColorGradient, returns a table of value, colornumber, color bar git-svn-id: https://svn.fhem.de/fhem/trunk@15240 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_DOIFtools.pm | 105 +++++++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/98_DOIFtools.pm b/fhem/FHEM/98_DOIFtools.pm index a7159b2ab..5bdbe8d57 100644 --- a/fhem/FHEM/98_DOIFtools.pm +++ b/fhem/FHEM/98_DOIFtools.pm @@ -329,7 +329,7 @@ sub DOIFtools_Initialize($) my $oldAttr = "target_room:noArg target_group:noArg executeDefinition:noArg executeSave:noArg eventMonitorInDOIF:noArg readingsPrefix:noArg"; - $hash->{AttrList} = "DOIFtoolsExecuteDefinition:1,0 DOIFtoolsTargetRoom DOIFtoolsTargetGroup DOIFtoolsExecuteSave:1,0 DOIFtoolsReadingsPrefix DOIFtoolsEventMonitorInDOIF:1,0 DOIFtoolsHideModulShortcuts:1,0 DOIFtoolsHideGetSet:1,0 DOIFtoolsMyShortcuts:textField-long DOIFtoolsMenuEntry:1,0 DOIFtoolsHideStatReadings:1,0 DOIFtoolsEventOnDeleted:1,0 DOIFtoolsEMbeforeReadings:1,0 DOIFtoolsNoLookUp:1,0 DOIFtoolsNoLookUpInDOIF:1,0 DOIFtoolsLogDir disabledForIntervals ".$oldAttr; + $hash->{AttrList} = "DOIFtoolsExecuteDefinition:1,0 DOIFtoolsTargetRoom DOIFtoolsTargetGroup DOIFtoolsExecuteSave:1,0 DOIFtoolsReadingsPrefix DOIFtoolsEventMonitorInDOIF:1,0 DOIFtoolsHideModulShortcuts:1,0 DOIFtoolsHideGetSet:1,0 DOIFtoolsMyShortcuts:textField-long DOIFtoolsMenuEntry:1,0 DOIFtoolsHideStatReadings:1,0 DOIFtoolsEventOnDeleted:1,0 DOIFtoolsEMbeforeReadings:1,0 DOIFtoolsNoLookUp:1,0 DOIFtoolsNoLookUpInDOIF:1,0 DOIFtoolsLogDir disabledForIntervals ".$oldAttr; #DOIFtoolsForceGet:true } sub DOIFtools_dO ($$$$){ @@ -339,10 +339,12 @@ return "";} sub DOIFtools_eM($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. my @dtn = devspec2array("TYPE=DOIFtools"); + my $lang = AttrVal("global","language","EN"); my $ret = ""; # call DOIF_detailFn no strict "refs"; - $ret .= &{ReadingsVal($dtn[0],".DOIF_detailFn","")}($FW_wname, $d, $room, $pageHash) if (ReadingsVal($dtn[0],".DOIF_detailFn","")); + my $retfn = &{ReadingsVal($dtn[0],".DOIF_detailFn","")}($FW_wname, $d, $room, $pageHash) if (ReadingsVal($dtn[0],".DOIF_detailFn","")); + $ret .= $retfn if ($retfn); use strict "refs"; if (!$room) { # LookUp in probably associated with @@ -350,10 +352,10 @@ sub DOIFtools_eM($$$$) { # Event Monitor if (AttrVal($dtn[0],"DOIFtoolsEventMonitorInDOIF","")) { my $a0 = ReadingsVal($d,".eM", "off") eq "on" ? "off" : "on"; - my $lang = AttrVal("global","language","EN"); $ret .= "
" if (ReadingsVal($dtn[0],".DOIF_detailFn","")); - $ret .= "
Event monitor: toggle  "; - $ret .= "
"; + $ret .= ""; + $ret .= "
Event monitor: toggle  "; + $ret .= "
"; my $a = ""; if (ReadingsVal($d,".eM","off") eq "on") { @@ -428,7 +430,7 @@ sub DOIFtools_fhemwebFn($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. my $ret = ""; # $ret .= ""; - $ret .= $DOIFtoolsJSfuncStart if (!AttrVal($d,"DOIFtoolsNoLookUp","")); + $ret .= $DOIFtoolsJSfuncStart if ($DOIFtoolsJSfuncStart && !AttrVal($d,"DOIFtoolsNoLookUp","")); # Logfile Liste if($FW_ss && $pageHash) { $ret.= "
". @@ -675,6 +677,34 @@ sub DOIFtools_Notify($$) { } return undef; } + +# DOIFtoolsLinColorGrad(start_color,end_color,percent|[$min,max,current]) +# start_color, end_color: 6 hexadecimal values as string with or without leading # +# percent: from 0 to 1 +# min: minmal value +# max: maximal value +# current: current value +# return: 6 hexadecimal value as string, prefix depends on input +sub DOIFtoolsLinColorGrad { + my ($sc,$ec,$pct,$max,$cur) = @_; + $pct = ($cur-$pct)/($max-$pct) if (@_ == 5); + my $prefix = ""; + $prefix = "#" if ("$sc $ec"=~"#"); + $sc =~ s/^#//; + $ec =~ s/^#//; + $pct = $pct > 1 ? 1 : $pct; + $pct = $pct < 0 ? 0 : $pct; + $sc =~/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/; + my @sc = (hex($1),hex($2),hex($3)); + $ec =~/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/; + my @ec = (hex($1),hex($2),hex($3)); + my @rgb; + for (0..2) { + $rgb[$_] = sprintf("%02X", int(($ec[$_] - $sc[$_])*$pct + $sc[$_] + .5)); + } + return $prefix.join("",@rgb); +} + sub DOIFtoolsRg { my ($hash,$arg) = @_; @@ -1125,6 +1155,7 @@ sub DOIFtools_Set($@) return $ret; } elsif ($arg eq "targetDOIF") { readingsSingleUpdate($hash,"targetDOIF",$value,0); + FW_directNotify("#FHEMWEB:$FW_wname", "location.reload('".AttrVal($pn,"DOIFtoolsForceGet","")."')", ""); } elsif ($arg eq "deleteReadingsInTargetDOIF") { if ($value) { my @i = split(",",$value); @@ -1141,6 +1172,7 @@ sub DOIFtools_Set($@) } } elsif ($arg eq "targetDevice") { readingsSingleUpdate($hash,"targetDevice",$value,0); + FW_directNotify("#FHEMWEB:$FW_wname", "location.reload('".AttrVal($pn,"DOIFtoolsForceGet","")."')", ""); } elsif ($arg eq "deleteReadingsInTargetDevice") { if ($value) { my @i = split(",",$value); @@ -1459,9 +1491,53 @@ sub DOIFtools_Get($@) $ret .= CommandAttr(undef,"$value icon helper_doif"); $ret .= CommandSave(undef,undef) if (AttrVal($pn,"DOIFtoolsExecuteSave","")); return $ret; + } elsif ($arg eq "linearColorGradient") { + my ($sc,$ec,$min,$max,$step) = split(",",$value); + if ($value && $sc =~ /[0-9A-F]{6}/ && $ec =~ /[0-9A-F]{6}/ && $min =~ /(-?\d+(\.\d+)?)/ && $max =~ /(-?\d+(\.\d+)?)/ && $step =~ /(-?\d+(\.\d+)?)/) { + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + for (my $i=$min;$i<=$max;$i+=$step) { + my $col = DOIFtoolsLinColorGrad($sc,$ec,$min,$max,$i); + $ret .= ""; + } + $ret .= "
Color Table
"; + for (my $i=0;$i<=255;$i++) { + my $col = DOIFtoolsLinColorGrad($sc,$ec,0,255,$i); + $ret .= ""; + } + $ret .= "
ValueColor NumberColor
".sprintf("%.1f",$i)."$col      
\n"; + + return $ret; + } else { + $ret = $DE ? "Syntax: +<Startfarbnummer>,<Endfarbnummer>,<Minimalwert>,<Maximalwert>,<Schrittweite> + +<Startfarbnummer>, ist eine HTML-Farbnummer, Beispiel: #0000FF für Blau. +<Endfarbnummer>, , ist eine HTML-Farbnummer, Beispiel: #FF0000 für Rot. +<Minimalwert>, der Minimalwert auf den die Startfarbnummer skaliert wird, Beispiel: 7. +<Maximalwert>, der Maximalwert auf den die Endfarbnummer skaliert wird, Beispiel: 30. +<Schrittweite>, für jeden Schritt wird ein Farbwert erzeugt, Beispiel: 0.5. + +Beispielangabe: #0000FF,#FF0000,7,30,0.5 +": +"Syntax: +<start color number>,<end color number>,<minimal value>,<maximal value>,<step width> + +<start color number>, a HTML color number, example: #0000FF for blue. +<end color number>, , a HTML color number, example: #FF0000 for red. +<minimal value>, the start color number will be scaled to it, example: 7. +<maximal value>, the end color number will be scaled to it, example: 30. +<step width>, for each step a color number will be generated, example: 0.5. + +Example specification: #0000FF,#FF0000,7,30,0.5 +"; + return $ret + } } else { my $hardcoded = "checkDOIF:noArg statisticsReport:noArg runningTimerInDOIF:noArg"; - return "unknown argument $arg for $pn, choose one of readingsGroup_for:multiple-strict,$dL DOIF_to_Log:multiple-strict,$dL SetAttrIconForDOIF:multiple-strict,$dL userReading_nextTimer_for:multiple-strict,$ntL ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :""); + return "unknown argument $arg for $pn, choose one of readingsGroup_for:multiple-strict,$dL DOIF_to_Log:multiple-strict,$dL SetAttrIconForDOIF:multiple-strict,$dL userReading_nextTimer_for:multiple-strict,$ntL ".(AttrVal($pn,"DOIFtoolsHideGetSet",0) ? $hardcoded :"")." linearColorGradient:textField"; } return $ret; @@ -1501,6 +1577,7 @@ DOIFtools contains tools to support DOIF.
  • create shortcuts
  • optionally create a menu entry
  • show a list of running wait timer
  • +
  • scale values to color numbers for coloration

  • Just one definition per FHEM-installation is allowed. More in the german section. @@ -1530,7 +1607,8 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
  • Zugriff aus DOIFtools auf vorhandene DOIFtoolsLog-Logdateien.
  • zeigt den Event Monitor in der Detailansicht von DOIFtools.
  • ermöglicht den Zugriff auf den Event Monitor in der Detailansicht von DOIF.
  • -
  • erzeugt DOIF-Operanden aus einer Event-Zeile des Event-Monitors:
  • +
  • erzeugt DOIF-Operanden aus einer Event-Zeile des Event-Monitors.
  • +
  • skaliert Werte zu Farbnummern zum Einfärben, z.B. von Icons.