From 5f8280c6efaa6e96b904073eb8b1dfa49393a1c1 Mon Sep 17 00:00:00 2001 From: Ellert <> Date: Sat, 14 Oct 2017 16:37:12 +0000 Subject: [PATCH] 98_DOIFtools: add getter modelColorGradient, returns a table of value, colornumber, RGB values and color bar using Color::pahColor git-svn-id: https://svn.fhem.de/fhem/trunk@15254 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/98_DOIFtools.pm | 114 ++++++++++++++++++++++++++++++++++---- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 46b2c9a20..c4599bfd3 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # 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. + - feature: 98_DOIFtools: add getter modelColorGradient, returns a table of + value, colornumber, RGB values and color bar using Color::pahColor - new: 98_Siro.pm: New module for Siro shutters - feature: 98_DOIFtools: add RGB color values to color table - bugfix: 88_HMCCURPC: fixed bug in event timeout handling diff --git a/fhem/FHEM/98_DOIFtools.pm b/fhem/FHEM/98_DOIFtools.pm index 2cb0c1c27..5b7d05168 100644 --- a/fhem/FHEM/98_DOIFtools.pm +++ b/fhem/FHEM/98_DOIFtools.pm @@ -22,6 +22,7 @@ package main; use strict; use warnings; use Time::Local; +use Color; sub DOIFtools_Initialize($); sub DOIFtools_Set($@); @@ -1519,9 +1520,9 @@ sub DOIFtools_Get($@) <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. +<Schrittweite>, für jeden Schritt wird ein Farbwert erzeugt, Beispiel: 1. -Beispielangabe: #0000FF,#FF0000,7,30,0.5 +Beispielangabe: #0000FF,#FF0000,7,30,1 ": "Wrong input:$value\nSyntax: <start color number>,<end color number>,<minimal value>,<maximal value>,<step width> @@ -1530,15 +1531,92 @@ Beispielangabe: #0000FF,#FF0000,7,30,0.5 <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. +<step width>, for each step a color number will be generated, example: 1. -Example specification: #0000FF,#FF0000,7,30,0.5 +Example specification: #0000FF,#FF0000,7,30,1 "; return $ret } + } elsif ($arg eq "modelColorGradient") { + my $err_ret = $DE ? "Falsche Eingabe:$value\nSyntax: +<Minimalwert>,<Zwischenwert>,<Maximalwert>,<Schrittweite><Farbmodel> + +<Minimalwert>, der Minimalwert auf den die Startfarbnummer skaliert wird, Beispiel: 7. +<Zwischenwert>, der Fixpunkt zwischen Start- u. Endwert, Beispiel: 20. +<Maximalwert>, der Maximalwert auf den die Endfarbnummer skaliert wird, Beispiel: 30. +<Schrittweite>, für jeden Schritt wird ein Farbwert erzeugt, Beispiel: 1. +<Farbmodel>, die Angabe eines vordefinierten Modells <0|1|2> oder + fünf RGB-Werte als Array [r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4,r5,g5,b5] für ein eigenes Model. + +Beispielangabe: 0,50,100,5,[255,255,0,127,255,0,0,255,0,0,255,255,0,127,255] + oder: 7,20,30,1,0 +": +"Wrong input:$value\nSyntax: +<minimal value>,<middle value>,<maximal value>,<step width>,<color model> + +<minimal value>, the start color number will be scaled to it, example: 7. +<middle value>, a fix point between min and max, example: 20. +<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: 1. +<color model>, a predefined number <0|1|2> or an array of five RGB values,[r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4,r5,g5,b5] + +Example specification: 0,50,100,5,[255,255,0,127,255,0,0,255,0,0,255,255,0,127,255] + or: 7,20,30,1,0 +"; + return $err_ret if (!$value); + my ($min,$mid,$max,$step,$colors); + my $err = ""; + $value =~ s/,(\[.*\])//; + if ($1) { + $colors = eval($1); + if ($@) { + $err="Error eval 1567: $@\n".$err_ret; + Log3 $hash->{NAME},3,"modelColorGradient \n".$err; + return $err; + } + ($min,$mid,$max,$step) = split(",",$value); + } else { + ($min,$mid,$max,$step,$colors) = split(",",$value); + } + return $err_ret if ($min>=$mid or $mid >= $max or $step <= 0 or (ref($colors) ne "ARRAY" && $colors !~ "0|1|2")); + my $erg=eval("\"".Color::pahColor($min,$mid,$max,$min+$step,$colors)."\""); + if ($@) { + $err="Error eval 1577: $@\n".$err_ret; + Log3 $hash->{NAME},3,"modelColorGradient \n".$err; + return $err; + } + $ret .= ""; + $ret .= ""; + $ret .= ""; + $ret .= ""; + for (my $i=$min;$i<=$max;$i+=$step) { + my $col = eval("\"".Color::pahColor($min,$mid,$max,$i,$colors)."\""); + if ($@) { + $err="Error eval 1567: $@\n".$err_ret; + Log3 $hash->{NAME},3,"modelColorGradient \n".$err; + return $err; + } + $col = "#".substr($col,0,6); + $col =~ /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/; + $ret .= ""; + } + $ret .= "
Color Table
"; + for (my $i=0;$i<=255;$i++) { + my $col = eval("\"".Color::pahColor($min,$mid,$max,$min+$i*($max-$min)/255,$colors)."\""); + if ($@) { + $err="Error eval 1567: $@\n".$err_ret; + Log3 $hash->{NAME},3,"modelColorGradient \n".$err; + return $err; + } + $col = "#".substr($col,0,6); + $ret .= "  "; + } + $ret .= "
Value Color Number RGB values Color
".sprintf("%.1f",$i)."$col ".hex($1).",".hex($2).",".hex($3)."       
\n"; + + 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 :"")." linearColorGradient:textField"; + 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 modelColorGradient:textField"; } return $ret; @@ -1726,16 +1804,28 @@ DOIFtools stellt Funktionen zur Unterstützung von DOIF-Geräten bereit.
SetAttrIconForDOIF setzt für die ausgewählten DOIF das Attribut icon auf helper_doif.

get <name> linearColorGradient <start color number>,<end color number>,<minimal value>,<maximal value>,<step width>
- linearColorGradient erzeugt eine Tabelle mit linear abgestuften Farbnummern.
- <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.
+ linearColorGradient erzeugt eine Tabelle mit linear abgestuften Farbnummern und RGB-Werten.
+ <start color number>, ist eine HTML-Farbnummer, Beispiel: #0000FF für Blau.
+ <end color number>, , ist eine HTML-Farbnummer, Beispiel: #FF0000 für Rot.
+ <minimal value>, der Minimalwert auf den die Startfarbnummer skaliert wird, Beispiel: 7.
+ <maximal value>, der Maximalwert auf den die Endfarbnummer skaliert wird, Beispiel: 30.
+ <step width>, für jeden Schritt wird ein Farbwert erzeugt, Beispiel: 0.5.
Beispiel: get DOIFtools linearColorGradient #0000FF,#FF0000,7,30,0.5

- + get <name> modelColorGradient <minimal value>,<middle value>,<maximal value>,<step width>,<color model>
+ modelColorGradient erzeugt eine Tabelle mit modellbedingt abgestuften Farbnummern und RGB-Werten, siehe FHEM-Wiki Farbskala mit Color::pahColor
+ <minimal value>, der Minimalwert auf den die Startfarbnummer skaliert wird, Beispiel: 7.
+ <middle value>, der Mittenwert ist ein Fixpunkt zwischen Minimal- u. Maximalwert, Beispiel: 20.
+ <maximal value>, der Maximalwert auf den die Endfarbnummer skaliert wird, Beispiel: 30.
+ <step width>, für jeden Schritt wird ein Farbwert erzeugt, Beispiel: 1.
+ <color model>, die Angabe eines vordefinierten Modells <0|1|2> oder fünf RGB-Werte als Array [r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4,r5,g5,b5] für ein eigenes Model.
+
+ Beispiele:
+ get DOIFtools modelColorGradient 7,20,30,1,0
+ get DOIFtools modelColorGradient 0,50,100,5,[255,255,0,127,255,0,0,255,0,0,255,255,0,127,255]
+
+