RSSI Werte schnell und nach CUL/CUN/HMLAN Devices als Tabelle dargestellt NEUE!

Begonnen von fhem-challenge, 08 Dezember 2016, 15:38:44

Vorheriges Thema - Nächstes Thema

fhem-challenge

Probleme mit dem Empfang von devices ? ... Anbei ein Werkzeug zur einfachen Analyse der Empfangswerte


Immer wieder plagen mich Empfangsprobleme. Natürlich gibt es sich Möglichkeit mit "advaltrigger=1" an allen CUL's/HMLAN etc. die RSSI Werte mit schreiben zu lassen und in FileLog (oder dblog) zu loggen, aber manchmal benötigt man nur einen schnellen, kompletten Überblick über alle Devices nach CUL's/CUNs/HMLANs etc.  aufgeteilt um etwaige Empfangsprobleme rasch erkennen zu können.

Was ist zu tun:

1.) Bei allen CULs/CUN./HMLAN etc. attr CUL addvaltrigger=1  ... setzen (Hinweis: Das kann mittlerweile auch durch Drücken des Button "Enable RSSI reading in internals" (siehe code) erreicht werden).
2.) Folgenden Code nutzen. Dabei wird schlicht die dummy variable "RSSI_Chart" defniert und wenn in FHEM die Variable auf "refresh"  gesetzt/geklickt wird, werden die RSSI Werte (in HTML Table und farblich markiert) dargestellt. Wichtig! im Code (ca. Zeile my $HTTP="http" auf "https" setzen, wenn man FHEM via HTTPS nutzt).
Wer es einfach haben möchte, kann einfach das File fhem.rssi.cfg (attached) verwenden, nach /opt/fhem/FHEM/ kopieren (oder eben das Verzeichnis, in dem die eigenen Configs liegen) und in seiner fhem.cfg ein "include /opt/fhem/FHEM/fhem.rssi.cfg" einfügen
3.) Bei der aller ersten Nutzung, einfach mal alle Buttons schalten (siehe Bild 3 oberer Bereich), da diese nur  bei Erstnutzung noch kein "state" haben.

Die Ausgabe sieht in FHEM dann z.B. wie angehängt (Bild) aus. Die Dokumentation dazu --> siehe auch die Bilder.

Wichtig: Nicht vergessen, "refresh" zu drücken. Nur damit werden natürlich auch die Werte in der Tabelle aktualisiert. Das gilt auch und insbesondere für die Änderungen an den Parametern. Die Auswirkung erkennt man erst nach einem "refresh". Gleiches (refresh) erreicht man aber auch in einem etwaigen eigenem Code (oder cron job --> at ...) mit fhem ("set RSSI_Chart refresh").

Vorteil: Es wird nicht immer im laufenden Betrieb RSSI mit geloggt (z.B. in FileLog etc.), sondern (Ressourcen schonend) nur, wenn man "refresh" klickt, dargestellt. Die Darstellung hat mir schon oft die Positionierung der CUNOs/HMLAN etc. erleichtert.

Man erkennt überdies auch , mit welchen Werten das gleiche sendende "Gerät/Sensor" von unterschiedlichen CULs/HMLANs etc. gleichzeitig empfangen wird und kann unmittelbar die Werte vergleichen.

Add: 12.12.2016: Ich habe noch die Möglichkeit hinzu gefügt, dass auch die vergangene Zeit (in s) seit dem letzten Empfang des jeweiligen CUL's/HMLAN angegeben wird. Hierzu muss man nur auf "with_time" "klicken", anstelle von "check".

Add: 3.1.2017: In der neuen Version wird auch der beste Empfangswert via "highlighting" besser dargestellt. Damit kan man sehr schnell erkennen, welches Device, von welchem CUN/CUL etc. am besten empfangen wird und kann hier ggf. auch das IODev setzen (so es denn ein Empfangendes Devices ist).Überdies werden nun die Devices sortiert [A-->Z] angezeigt.
Die RSSI Werte können nun auch mit "Clear all RSSI values in internals" gelöscht werden, sodass ab diesem Zeitpunkt nur! die neu empfangenen Werte dargestellt werden. Das mach Sinn, wenn man z.B. ein CUL/CUNO etc. neu positioniert und nun die Werte erneut lesen/darstellen möchte.

Add: 13.1.2017: Viele Code-Änderungen, einige BugFixes und viele Erweiterungen.
Nun kann auch jedes empfangene Device einzeln aus der Darstellung/Berechnung heraus genommen werden.
Einen Differenzdarstellung (gespeicherter RSSI Wert - aktueller RSSI Wert) ist nun möglich. Gerade das macht Sinn, da hiermit ein CUL/CUNO/HMLAN oder anderes IODev funktechnisch neu positioniert werden kann und das Ergebnis als RSSI Differenz schnell sichtbar und damit der Erfolg/oder Miserfolg der Neupositionierung deutlich wird.

Add: 17.1.2017: Weitere IODev's hinzugefügt und bugfix: "Clear all RSSI values in internals" funktioniert nun korrekt.

Add: 1.2.2017: Weiteres IODev hinzugefügt (TYPE=HMUARTLGW:FILTER=DevType!=LGW-KeepAlive), sowie HTTPS Icon fix.

Add: 2.2.2017: Colorscheme eingefügt, damit die Tabelle auch mit Bright-Styles in FHEM besser sichtbar ist (Button: Use dark colorscheme (for bright FHEM backgrounds)).

Add: 6.3.2017: Stackable CC & TSCUL hinzugefügt.

Add: 13.9.2017: kleine bugfixes.


#############################################################
#### RSSI Werte aller IODev's mitschreiben und auswerten ####
#############################################################
#
# A.I. v 1.1
#
##################################################
## Dummy fuer alle RSSI Werte folgende Funktion ##
##################################################
# Dummy fuer die HTML (Table) Ausgabe
define RSSI_Chart dummy
attr RSSI_Chart alias RSSI<br>Values
attr RSSI_Chart group RSSI Values
attr RSSI_Chart room RSSI
attr RSSI_Chart webCmd refresh


########################
## RSSI Setup Buttons ##
########################
define RSSI_SetUpHighlight dummy
attr RSSI_SetUpHighlight alias Highlight the best value in a row
attr RSSI_SetUpHighlight devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpHighlight group RSSI Buttons
attr RSSI_SetUpHighlight room RSSI
attr RSSI_SetUpHighlight sortby 1

define RSSI_SetUpLastActive dummy
attr RSSI_SetUpLastActive alias Show last reception in [s]
attr RSSI_SetUpLastActive devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpLastActive group RSSI Buttons
attr RSSI_SetUpLastActive room RSSI
attr RSSI_SetUpLastActive sortby 2

define RSSI_SetUpBestCol dummy
attr RSSI_SetUpBestCol alias Show column best value
attr RSSI_SetUpBestCol devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpBestCol group RSSI Buttons
attr RSSI_SetUpBestCol room RSSI
attr RSSI_SetUpBestCol sortby 3

define RSSI_SetUpAverage dummy
attr RSSI_SetUpAverage alias Show average row (and Log into Logfile)
attr RSSI_SetUpAverage devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpAverage group RSSI Buttons
attr RSSI_SetUpAverage room RSSI
attr RSSI_SetUpAverage sortby 4

define RSSI_SetUpInternals dummy
attr RSSI_SetUpInternals alias Enable RSSI reading in internals
attr RSSI_SetUpInternals devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpInternals group RSSI Buttons
attr RSSI_SetUpInternals room RSSI
attr RSSI_SetUpInternals sortby 5

define RSSI_SetUpAverageSaveOldValues dummy
attr RSSI_SetUpAverageSaveOldValues alias Save old RSSI values and calculate only diffs (currently not saved)
attr RSSI_SetUpAverageSaveOldValues devStateIcon .*0:ios-off:1 .*:ios-on-blue:0
attr RSSI_SetUpAverageSaveOldValues group RSSI Buttons
attr RSSI_SetUpAverageSaveOldValues room RSSI
attr RSSI_SetUpAverageSaveOldValues sortby 7

define RSSI_SetUpShowOldValues dummy
attr RSSI_SetUpShowOldValues alias Show old values while using diffs
attr RSSI_SetUpShowOldValues devStateIcon .*0:ios-off:1 .*:ios-on-blue:0
attr RSSI_SetUpShowOldValues disable 1
attr RSSI_SetUpShowOldValues group RSSI Buttons
attr RSSI_SetUpShowOldValues room RSSI
attr RSSI_SetUpShowOldValues sortby 8

define RSSI_SetUpColorSchemeDark dummy
attr RSSI_SetUpColorSchemeDark alias Use dark colorscheme (for bright FHEM backgrounds)
attr RSSI_SetUpColorSchemeDark devStateIcon .*0:ios-off:1 .*:ios-on-green:0
attr RSSI_SetUpColorSchemeDark group RSSI Buttons
attr RSSI_SetUpColorSchemeDark room RSSI
attr RSSI_SetUpColorSchemeDark sortby 6

define RSSI_SetUpClearRSSIValues dummy
attr RSSI_SetUpClearRSSIValues alias Clear all RSSI values in internals
attr RSSI_SetUpClearRSSIValues devStateIcon .*0:message_garbage:1 .*:message_garbage:0
attr RSSI_SetUpClearRSSIValues group RSSI Buttons
attr RSSI_SetUpClearRSSIValues room RSSI
attr RSSI_SetUpClearRSSIValues sortby 9



###################################
# delete all internal RSSI values #
###################################
define RSSI_ClearAllRSSIValues notify RSSI_SetUpClearRSSIValues:[0,1] set RSSI_Chart clear


############################################
# schreibt die momentanen RSSI Werte       #
# in das entsprechende Reading des Devices #
############################################
# Bsp: "internal" eines Devices: CUNO2_RSSI:-71.0 wird in das Reading "CUNO2_RSSI_old:-71" geschrieben
define RSSI_Save_old_values notify RSSI_SetUpAverageSaveOldValues:[0,1] { \
my @culs=devspec2array("TYPE=CUL");;\
push(@culs, devspec2array("TYPE=HMLAN"));;\
push(@culs, devspec2array("TYPE=CUL_RFR"));;\
push(@culs, devspec2array("TYPE=HMCCUDEV"));;\
push(@culs, devspec2array("TYPE=CUL_MAX"));;\
push(@culs, devspec2array("TYPE=HMUARTLGW:FILTER=DevType!=LGW-KeepAlive"));;\
\
my $cul_rssi="";;\
my $all_int="";;\
my $dev="";;\
my $but_alias="";;\
my $date=$mday.".".$month.".".$year." ".$hour.":".$min.":".$sec;;\
\
if ($EVENT eq "1")\
{\
Log 0,"Speicher momentan RSSI values der devices in die readings z.B. CUNO2_RSSI_old";;\
my @device=devspec2array("i:LASTInputDev=\\w.*");;\
foreach(@device) \
{ \
$dev=$_;;\
foreach(@culs) \
{\
if (InternalVal("$_","type","") eq "CUL_MAX")\
{\
$cul_rssi="RSSI"\
}\
else\
{\
$cul_rssi="$_"."_RSSI"\
}\
\
$all_int=InternalVal($dev,$cul_rssi,"");;\
if ($all_int)\
{\
fhem("setreading $dev ".$cul_rssi."_old ".$all_int)\
\
}\
}\
\
}\
\
$but_alias="Save old RSSI values and calculate only diffs (saved: $date)";;\
fhem ("attr RSSI_SetUpAverageSaveOldValues alias $but_alias");;\
fhem ("attr RSSI_SetUpShowOldValues disable 0");;\
fhem ("set RSSI_Chart refresh")\
}\
else\
{\
Log 0,"Loesche alte gespeicherte RSSI values aus den devices readings Bsp: CUNO2_RSSI_old";;\
foreach(@culs) \
{\
$cul_rssi="$_"."_RSSI_old";;\
fhem ("deletereading .* $cul_rssi")\
}\
$but_alias="Save old RSSI values and calculate only diffs (currently not saved)";;\
fhem ("attr RSSI_SetUpAverageSaveOldValues alias $but_alias");;\
fhem ("attr RSSI_SetUpShowOldValues disable 1")\
}\
\
}\

## Liesst die RSSI Werte aller Devices ##
#########################################
# Schreibt dieses in ein Dummy device in HTML
define rssi_read_from_device notify RSSI_Chart:(refresh|clear) {\
my @culs=devspec2array("TYPE=HMLAN");;\
push(@culs, devspec2array("TYPE=CUL"));;\
push(@culs, devspec2array("TYPE=CUL_RFR"));;\
push(@culs, devspec2array("TYPE=HMCCUDEV"));;\
push(@culs, devspec2array("TYPE=CUL_MAX"));;\
#push(@culs, devspec2array("TYPE=HMUARTLGW"));;\
push(@culs, devspec2array("TYPE=HMUARTLGW:FILTER=DevType!=LGW-KeepAlive"));;\
push(@culs, devspec2array("TYPE=STACKABLE_CC"));;\
\
\
my $HTTP="http";; # change it to "https", if youre using https instead of http for FHEM\
my $nr_culs=scalar @culs;;\
my $colspan=$nr_culs+3;;\
my $dev ="";;\
my $cul_rssi="";;\
my $datum = strftime "%Y-%m-%d_%H:%M:%S", localtime;;\
my $rssi_chart="<table border='1' bordercolor'black'><tr bgcolor=yellow><td colspan=".$colspan.">\\
<div align='center'><font color='black'><b>RSSI Values of all devices from: ".$datum."</b>\\
</font><a href=$HTTP://$FW_httpheader{Host}/fhem?cmd=set%20RSSI_Chart%20refresh>\\
<font color='darkred'>&nbsp;;;;&nbsp;;;;&nbsp;;;;<b>REFRESH</b></font></a></div></td></tr>";;\
my $nr=0;;\
my $cnt=0;;\
my $num=0;;\
my $rr=0;;\
my $line="";;\
my $header="<td>Enable</td>";;\
my $col="green";;\
my $alias="";;\
my $bestVal="";;\
my @all_values=();;\
my @all_best_cul=();;\
my $best_value="";;\
my $ButHighLight=Value("RSSI_SetUpHighlight");;\
my $ButBestCol=Value("RSSI_SetUpBestCol");;\
my $ButLastActive=Value("RSSI_SetUpLastActive");;\
my $ButShowAverage=Value("RSSI_SetUpAverage");;\
my $ButShowOldValues=Value("RSSI_SetUpShowOldValues");;\
my $ButtonColorSchemeDark=Value("RSSI_SetUpColorSchemeDark");;\
my @cul_avg=();;\
my @cul_num=();;\
my $all_best=0;;\
my $nr_allBest=0;;\
my $disabled="";;\
my $disabled_set="";;\
my $dev_disable="";;\
my $old_rssi_val="";;\
my $org_int="";;\
my $fntColor1="lightblue";;\
my $fntColor2="white";;\
my $bgColor1="#006600";;\
my $colGood="lightgreen";;\
my $colMid="yellow";;\
my $colBad="#ff8533";;\
my $colWorse="red";;\
my $cul_alias="";;\
my $all_int="";;\
\
\
my $calc_diffs=ReadingsVal("RSSI_SetUpAverageSaveOldValues","state","");;\
\
if ($ButBestCol eq 1) {$header=$header."<td>best</td>"};;\
\
my @device=devspec2array("i:LASTInputDev=\\w.*");;\
@device = sort @device;;\
\
if ($ButtonColorSchemeDark eq 1)\
{\
$fntColor1="darkblue";;\
$fntColor2="darkblue";;\
$colGood="darkgreen";;\
$colMid="darkyellow";;\
$colBad="#ff8533";;\
$colWorse="red";;\
$bgColor1="#00A700";;\
}\
else\
{\
$fntColor1="lightblue";;\
$fntColor2="white";;\
$colGood="lightgreen";;\
$colMid="yellow";;\
$colBad="#ff8533";;\
$colWorse="red";;\
$bgColor1="#006600";;\
}\
\
foreach(@culs) \
{\
$cul_alias=AttrVal("$_","alias","$_");;\
$header=$header."<td><div align='center'><a href=".$HTTP."://$FW_httpheader{Host}/fhem?detail=$_ target='_blank'>\\
<font color='".$fntColor1."'>".$cul_alias."</font></a><div></td>";;\
}\
\
$rssi_chart=$rssi_chart."<tr><td><div align='left'><font color='".$fntColor1."'>Device</font></div></td>".$header."</tr>";;\
foreach(@device) \
{\
$dev=$_;;\
$line="";;\
$alias=AttrVal($dev,"alias",$dev);;\
@all_values=();;\
@all_best_cul=();;\
$num=0;; \
$dev_disable=ReadingsVal("$dev","RSSI_disable","0");;\
foreach(@culs) \
{\
if (InternalVal("$_","TYPE","") eq "CUL_MAX")\
{\
$cul_rssi="RSSI"\
}\
else\
{\
$cul_rssi="$_"."_RSSI"\
}\
\
if ($EVENT eq "clear") \
{\
delete($defs{"$dev"}{"$cul_rssi"})\
} \
\
$all_int=InternalVal($dev,$cul_rssi,"");;\
\
if ($calc_diffs eq "1")\
{\
$old_rssi_val=ReadingsVal($dev,$cul_rssi."_old","");;\
if (($old_rssi_val)&&($all_int))\
{\
$org_int=$all_int;;\
$all_int=$all_int-$old_rssi_val\
}\
else\
{\
$all_int="0"\
}\
}\
\
my $cul_time=InternalVal($dev,"$_"."_TIME","");;\
my $last_activity_since = int(time - time_str2num($cul_time));;\
my $best_value = "";;\
\
if (!$cul_avg[$num])\
{\
$cul_avg[$num]=0;;\
}\
\
if (!$cul_num[$num])\
{\
$cul_num[$num]=0;;\
}\
\
if ($all_int) \
{ \
$nr ++\
}\
\
if (($all_int) && ($dev_disable eq "0"))\
{ \
$cul_avg[$num]=$cul_avg[$num] + $all_int;;\
$cul_num[$num]=$cul_num[$num] + 1;;\
@all_values = (@all_values, $all_int);;\
@all_best_cul = (@all_best_cul, "$_");;\
my $ShowOldDiffs="";;\
if ($calc_diffs ne "1")\
{\
\
if ($all_int >= -75) { $col="$colGood" }\
if ($all_int < -75)  { $col="$colMid" }\
if ($all_int <= -80) { $col="$colBad" }\
if ($all_int <= -85) { $col="$colWorse" }\
}\
else\
{\
if ($all_int >= 0) \
{ \
$col="$fntColor1" \
}\
else\
{\
$col="red"\
}\
if ($ButShowOldValues eq "1")\
{\
$ShowOldDiffs="<br><font color='".$fntColor2."' size='1'>$old_rssi_val &rarr;;;; $org_int</font>"\
}\
}\
\
my $row="<td><font color=$col> ".$all_int." </font>$ShowOldDiffs";;\
if ($ButLastActive eq 0)\
{\
$line=$line.$row."</td>";;\
}\
if ($ButLastActive eq 1) \
{\
$line=$line.$row."<div align='center'><font color='".$fntColor2."' size='1'>(".$last_activity_since." s)</font></div></td>";;\
}\
}\
else\
{\
$line=$line."<td></td>";; \
} \
$num++;;\
}\
if ($nr > 0)\
{\
# find best RSSI values and mark with bold and underline \
if (@all_values) \
{\
$best_value = $all_values[0];;\
$rr=0;;\
for(@all_values) \
{\
if ($_ > $best_value)\
{\
$best_value = $_;;\
$rr++;;\
}\
}\
}\
\
# for further extension\
# if (@all_best_cul)\
# {\
# Log 0,"$rr;; $all_best_cul[$rr];;@all_values;;@all_best_cul";;\
# }\
\
if ($dev_disable eq 0)\
{\
if (!$best_value) {$best_value=0}\
if ($best_value >= -75) { $col="$colGood" }\
if ($best_value < -75)  { $col="$colMid" }\
if ($best_value <= -80) { $col="$colBad" }\
if ($best_value <= -85) { $col="$colWorse" } \
$line =~ s/\./,/g;;\
if ($ButHighLight eq 1)\
{ \
$nr_allBest++;;\
$all_best=$all_best+$best_value;;\
my $search_best_value=$best_value;;\
$best_value =~ s/\./,/g;;\
$line =~ s/ $search_best_value /<strong><div style='background-color: $bgColor1'>$best_value<\/div><\/strong>/g;;\
}\
}\
\
if ($ButBestCol eq 1) \
{\
$bestVal="<td><font color=$col>".$best_value."</font></td>";;\
}\
\
if ($dev_disable eq 1)\
{\
$disabled = $HTTP."://$FW_httpheader{Host}/fhem/images/default/ios-off.png";;\
$disabled_set = "0";;\
$col="grey";;\
if ($ButBestCol eq 1) \
{\
$bestVal="<td></td>";;\
}\
}\
else\
{\
\
$disabled = $HTTP."://$FW_httpheader{Host}/fhem/images/default/ios-on-green.png";;\
$disabled_set = "1";; \
}\
\
$cnt++;;\
$rssi_chart=$rssi_chart."<tr><td><div align='left'><b><a href=$HTTP://$FW_httpheader{Host}/fhem?detail=$dev target='_blank'><font color=$col>";;\
$rssi_chart=$rssi_chart.$cnt." ".$alias."</font></a></b></div></td><td>";;\
$rssi_chart=$rssi_chart."<a href=$HTTP://$FW_httpheader{Host}/fhem?cmd=setreading%20$dev%20RSSI_disable%20$disabled_set;;;;trigger%20RSSI_Chart%20refresh>";;\
$rssi_chart=$rssi_chart."<img src=$disabled width=75%></a></td>".$bestVal.$line."</tr>";;\
\
$nr=0;; \
} \
\
}\
\
if ($ButShowAverage eq 1)\
{\
my $txt_rssi="";;\
$rssi_chart="$rssi_chart"."<tr><td colspan='100%'></td></tr>";;\
if ($calc_diffs eq "1")\
{\
$txt_rssi="delta RSSI (diff to stored values)"\
}\
else\
{\
$txt_rssi="average RSSI"\
}\
$rssi_chart="$rssi_chart"."<tr bgcolor=MediumBlue><div align='center'><td><font color='white'><b>$txt_rssi</b></font></td><td></td>";;\
if ($ButBestCol eq 1) \
{\
if (!$nr_allBest) {$nr_allBest=1}\
my $best_all="";;\
if ($calc_diffs eq "1")\
{\
$best_all= sprintf "%.2f", $all_best;;\
if ($best_all >= 0) \
{ \
$col="lightgreen"\
}\
else\
{\
$col="red"\
}\
}\
else\
{\
$best_all= sprintf "%.2f", $all_best/$nr_allBest;;\
if ($best_all != 0)\
{\
if ($best_all >= -75) { $col="lightgreen" }\
if ($best_all < -75)  { $col="yellow" }\
if ($best_all <= -80) { $col="#ff8533" }\
if ($best_all <= -85) { $col="red" } \
}\
}\
\
$rssi_chart=$rssi_chart."<td><font color=$col><b>".$best_all."</b></font></td>";;\
}\
\
my $average="";;\
for(my $i = 0;; $i < @cul_avg;; $i++) \
{ \
\
if ($cul_avg[$i] != 0)\
{\
if ($calc_diffs eq "1")\
{\
$average = sprintf "%.2f", $cul_avg[$i];;\
if ($average >= 0)\
{\
$col="lightgreen"\
}\
else\
{\
$col="red"\
}\
}\
else\
{\
$average = sprintf "%.2f", $cul_avg[$i]/$cul_num[$i];;\
if ($average >= -75) { $col="lightgreen" }\
if ($average < -75)  { $col="yellow" }\
if ($average <= -80) { $col="#ff8533" }\
if ($average <= -85) { $col="red" } \
}\
\
}\
else\
{\
$average="";; \
}\
\
$rssi_chart="$rssi_chart"."<td><font color=$col><b>$average</b></font></td>";;\
Log 0,"RSSI Average:$culs[$i];;$average";; \
}\
if (!$nr_allBest) {$nr_allBest = 1}\
my $best_all= sprintf "%.2f", $all_best/$nr_allBest;;\
Log 0,"RSSI Average all best: $best_all";;\
$rssi_chart="$rssi_chart"."</tr>";;\
}\
$rssi_chart="$rssi_chart"."</table>";;\
\
if ($EVENT eq "clear") \
{ \
Log 0,"Clearing all RSSI internal values";;\
}\
fhem ("set RSSI_Chart $rssi_chart");; \
}\


##################
## RSSI als CSV ##
##################

define rssi_csv_create notify RSSI_Chart_csv:check { \
my @culs =devspec2array("TYPE=HMLAN");;\
push(@culs, devspec2array("TYPE=CUL"));;\
my $nr_culs=scalar @culs;;\
my $colspan=$nr_culs+2;;\
my $dev ="";;\
my $cul_rssi="";;\
my $datum = strftime "%Y-%m-%d_%H:%M:%S", localtime;;\
my $rssi_chart="";;\
my $nr=0;;\
my $line="";;\
my $header="Device;;;;";;\
my $col="green";;\
my $alias="";;\
my @device=devspec2array("i:LASTInputDev=\\w.*");;\
foreach(@culs) \
{\
$header=$header."$_;;;;";;\
}\
$rssi_chart=$rssi_chart."".$header."<br>";;\
foreach(@device) \
{\
$dev=$_;;\
$line="";;\
$alias=AttrVal($dev,"alias",$dev);;\
foreach(@culs) \
{\
$cul_rssi="$_"."_RSSI";;\
my $all_int=InternalVal($dev,$cul_rssi,"");;\
if ($all_int)\
{\
$nr ++;;\
$all_int =~ s/\./,/g;;\
$line=$line.";;;;".$all_int."";;\
}\
else\
{\
$line=$line.";;;;";; \
} \
}\
if ($nr > 0)\
{\
$rssi_chart=$rssi_chart."".$alias."".$line."<br>";;\
$line="";;\
$nr=0;; \
} \
}\
\
$rssi_chart="$rssi_chart</div>";;\
fhem ("set RSSI_Chart_csv $rssi_chart");;\
}\



Viele Grüße!

Andreas

frank

kennst du hminfo? => get hminfo rssi.
ist natürlich nicht so schön bunt.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

fhem-challenge

Zitat von: frank am 11 Dezember 2016, 12:12:48
kennst du hminfo? => get hminfo rssi.
ist natürlich nicht so schön bunt.

Ja, aber ich habe nicht nur HM devices, sondern werte auch RSSI von meinen CUL's  (868,433) usw. aus, deshalb auch die Funktion.

Viele Grüße!


Andreas

sash.sc

Danke für dieses Chart.

Wie stelle ich es an, dass die RSSI Werte in ein LOG File geschrieben werden ????
Dann kann ich es evtl. in einen Diagramm packen !!

Gruß und Danke

Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

justme1968

das kann man auch mit einer readingsGroup umsetzen. die wird auch direkt bei jedem refresh im browser aktualisiert ohne extra knopf.

define culRSSI readingsGroup <>,<HMLAN>,<CUL>,<CUL2>,<CUL3>,<panStamp>,<>\
cul_RSSI=.*:+cul_RSSI,+cul_TIME cul2_RSSI=.*:+hmlan_RSSI,+cul2_RSSI,+cul2_TIME cul3_RSSI=.*:+cul3_RSSI,+cul3_TIME panStamp_RSSI=.*:+panStamp_RSSI,+panStamp_TIME
attr culRSSI alias RSSI Werte
attr culRSSI room 9 System
attr culRSSI valueColumn { '' => 6, hmlan_RSSI => 1, cul_RSSI => 2, cul2_RSSI => 3, cul3_RSSI => 4, panStamp_RSSI => 5 }
attr culRSSI valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE <= -85)?'style="color:red"':($VALUE <= -80)?'style="color:yellow"':undef}


gruss
  andre

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

fhem-challenge

#5
Zitat von: sash.sc am 18 Dezember 2016, 12:01:49
Danke für dieses Chart.

Wie stelle ich es an, dass die RSSI Werte in ein LOG File geschrieben werden ????
Dann kann ich es evtl. in einen Diagramm packen !!

Gruß und Danke

Sascha

Gerne. Anbei die relevanten Files zum Plotten der RSSI.

Hiermit alles mit :RSSI.* ins logfile "loggen":
### RSSI log
define RSSI_Logging FileLog /opt/fhem/rssi_all_log .*:RSSI.*
attr RSSI_Logging logtype text
attr RSSI_Logging room Logfiles


Hier der Plot. Hierbei muss in "attr plotfunction" das device sowie der CUL angegeben werden. Hier im Beispiel also: Wetterstation.CUNO2, damit vom device "Wetterstation" der RSSI vom CUL=CUNO2 dargestellt werden kann.
Ich stelle nahezu alle Devices und deren RSSI in Plots dar und kann dann im Überblick sehr leicht die Einflüsse bei Verschieben des Devices/des CULs im Plot erkennen. Insbesondere beim NeuPositionieren eines CULs/CUNO/was auch immer ... erkennt man schnell den gesamten Effekt auf alle Devices.

### Plot RSSI Wetterstation
define RSSI_CUNO2_Wetterstation SVG rssi_all_log:rssi_culs_plot:CURRENT
attr RSSI_CUNO2_Wetterstation plotfunction Wetterstation.CUNO2
attr RSSI_CUNO2_Wetterstation room RSSI_Plots
attr RSSI_CUNO2_Wetterstation title "Wetterstation"



Hier das gplot File. Aus meiner Sicht ist es sinnvoll, hier "Points" anstelle von Linien zu verwenden, da ich hierbei genauer erkennen kann, wann FHEM empfangen hat.
# Created by FHEM/98_SVG.pm, 2016-12-12 14:25:55
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid ytics
set ylabel "RSSI"
set y2label "RSSI"
set yrange [-95:-35]
set y2range [-95:-35]


#rssi_all_log 5:<SPEC1>::

plot "<IN>" using 1:2 axes x1y2 notitle ls l0 lw 1 with points



Anbei ein Ausschnitt der RSSI Plots, basierend auf den o.g. Files.


Viele Grüße!

Andreas

fhem-challenge

#6
Zitat von: justme1968 am 18 Dezember 2016, 12:27:05
das kann man auch mit einer readingsGroup umsetzen. die wird auch direkt bei jedem refresh im browser aktualisiert ohne extra knopf.

define culRSSI readingsGroup <>,<HMLAN>,<CUL>,<CUL2>,<CUL3>,<panStamp>,<>\
cul_RSSI=.*:+cul_RSSI,+cul_TIME cul2_RSSI=.*:+hmlan_RSSI,+cul2_RSSI,+cul2_TIME cul3_RSSI=.*:+cul3_RSSI,+cul3_TIME panStamp_RSSI=.*:+panStamp_RSSI,+panStamp_TIME
attr culRSSI alias RSSI Werte
attr culRSSI room 9 System
attr culRSSI valueColumn { '' => 6, hmlan_RSSI => 1, cul_RSSI => 2, cul2_RSSI => 3, cul3_RSSI => 4, panStamp_RSSI => 5 }
attr culRSSI valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE <= -85)?'style="color:red"':($VALUE <= -80)?'style="color:yellow"':undef}


gruss
  andre


Ja, vollkommen richtig, geht auch gut mit readingsgroups (hatte ich auch vorher).

Kleiner Nachteil:

- Ich wechsele ab und zu mal die CULs/CUNOs/HMLAN1 (einer kommt dazu, einer wieder weg etc.) und müsste dann immer die "readingsgroups" entsprechend anpassen.
- Ich wollte ganz bewusst kein "refresh" bereits beim Seitenaufbau a'la readingsgroups, sondern diesen manuell erzeugen, damit ich die alten und neuen RSSI Werte vergleichen kann.

Eine Ergänzung ist noch das "plotten" der RSSI values , was ich additiv mache um größere (globalere) Veränderungen feststellen zu können und damit etwaige Auswirkungen auf mehrere Devices. -->  https://forum.fhem.de/index.php/topic,62184.msg544163.html#msg544163

Viele Grüße!

Andreas


hartenthaler

Ich hatte gerade gestern das Problem, dass ich auch die RSSI-Werte meiner neuen CCU2 sehen wollte (neben den HMLAN-Werten, die ich schon länger überwache). Habe dann erst einmal die Version von Andre angepasst, aber werde mir nun auch mal Deine Version, Andreas, näher ansehen. Schön fand ich, dass man die Spalten in der readingsGroup per sortColumn sortieren kann, so dass man neben der Farbkennzeichnung auch aus dem Rangplatz leicht Schlüsse ziehen kann.

define rg_RSSI readingsGroup <Sensor/Aktor>,<HMLAN>,<CCU2>,<Zeitstempel> HMLAN1_RSSI=.*:+HMLAN1_RSSI,+HMLAN1_TIME TYPE=HMCCUDEV:Heizung_.*.RSSI_DEVICE
attr rg_RSSI alias Sende- und Empfangspegel Homematic
attr rg_RSSI group Homematic
attr rg_RSSI mapping %ALIAS
attr rg_RSSI room Homematic,System
attr rg_RSSI sortColumn 2
attr rg_RSSI valueColumn { '' => 2, HMLAN1_RSSI => 1, HMLAN1_TIME => 3 }
attr rg_RSSI valueFormat { "%i dBm" if ($VALUE =~ m/^\-\d/o) }
attr rg_RSSI valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE <= -85)?'style="text-align:right;;color:red"':($VALUE <= -80)?'style="text-align:right;;color:orange"':'style="text-align:right"'}
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

fhem-challenge

#8
Zitat von: hartenthaler am 22 Dezember 2016, 19:01:59
Ich hatte gerade gestern das Problem, dass ich auch die RSSI-Werte meiner neuen CCU2 sehen wollte (neben den HMLAN-Werten, die ich schon länger überwache). Habe dann erst einmal die Version von Andre angepasst, aber werde mir nun auch mal Deine Version, Andreas, näher ansehen. Schön fand ich, dass man die Spalten in der readingsGroup per sortColumn sortieren kann, so dass man neben der Farbkennzeichnung auch aus dem Rangplatz leicht Schlüsse ziehen kann.

define rg_RSSI readingsGroup <Sensor/Aktor>,<HMLAN>,<CCU2>,<Zeitstempel> HMLAN1_RSSI=.*:+HMLAN1_RSSI,+HMLAN1_TIME TYPE=HMCCUDEV:Heizung_.*.RSSI_DEVICE
attr rg_RSSI alias Sende- und Empfangspegel Homematic
attr rg_RSSI group Homematic
attr rg_RSSI mapping %ALIAS
attr rg_RSSI room Homematic,System
attr rg_RSSI sortColumn 2
attr rg_RSSI valueColumn { '' => 2, HMLAN1_RSSI => 1, HMLAN1_TIME => 3 }
attr rg_RSSI valueFormat { "%i dBm" if ($VALUE =~ m/^\-\d/o) }
attr rg_RSSI valueStyle {return undef if($READING =~ m/TIME/);; ($VALUE <= -85)?'style="text-align:right;;color:red"':($VALUE <= -80)?'style="text-align:right;;color:orange"':'style="text-align:right"'}


Ich habe bei mir nun einige Dinge erweitert.

-->  Hier lassen sich alle RSSI Werte löschen, damit bei etwaiger Neupositionierung nur die "neuen" Werte dargestellt werden können.
--> Überdies habe ich ein "highlighting" hinzugefügt, damit man recht schnell die "bestern" Empfangswerte in einer Zeile schneller erkennen kann. Gerade , wenn man mehrere CULs/CUNOs/MAXCubes/HMLANs beseitzt, ist so ein Überblick recht hilfreich.
--> Das schreiben der RSSI Werte in den internals habe ich via "Button" nun so geregelt, dass diese für alle CULs/CULn/MAx/HMLAN etc. ein/ausgeschaltet werden können. Also quasi ein "advaltrigger 0/1" gesetzt wird.


Viele Grüße!

Andreas

synaps-o-dan

Hallo Andreas,
vielen lieben Dank für die Arbeit, tolle Idee und Umsetzung. Gefällt mir persönlich besser als Lösungen, die auf readingsGroup  basieren. Ich habe zwei Anmerkungen:
1. Ich benutze für SlowRF neben einem CUL einen RFRCUL. Um den ebenfalls zu erfassen, habe ich den Anfang des notify rssi_read_from_device folgendermaßen geändert:
#########################################
## Liesst die RSSI Werte aller Devices ##
#########################################
# Schreibt dieses in ein Dummy device in HTML
define rssi_read_from_device notify RSSI_Chart:(refresh|clear) { \
my @culs_cul=devspec2array("TYPE=CUL");;\
my @culs =devspec2array("TYPE=HMLAN");;\
my @culs_rfr=devspec2array("TYPE=CUL_RFR");;\
push(@culs, @culs_cul, @culs_rfr);;\

(Ab da geht es mit Deinem Original-Code weiter.  Neu / geändert sind die Zeilen mit dem @culs_rfr.)
Was hältst Du von dieser Erweiterung?

2. Die Gerätenamen in der ersten Spalte sind ja gleichzeitig Links. Ich habe den Webzugriff auf fhem mit einem Zertifikat gesichert, da funktionieren die Links nicht. Ich habe die Zeile, in der Du die Links erzeugst, wie folgt geändert:
$rssi_chart=$rssi_chart."<tr><td><div align='left'><b><a href=https://$FW_httpheader{Host}/fhem?detail=$dev target='_blank'><font color=$col>".$alias."</font></a></b></div></td>".$bestVal.$line."</tr>";;\
Geändert wurde "http" in "https". Dann funzt es auch mit https. Das müsste aber jeder User nach seinen Gegebenheiten anpassen. Vielleicht kann man das automatisieren? (Über Abfrage der Attribute HTTPS der FHEMWEBs? Da gibt es aber mehrere von...)

Viele Grüße,
Daniel
fhem auf Raspberry Pi 3
5 x Set aus jew. 1x FHT80B + 1xFHT8V + 1x FHT80TF-2
HM: 1 x HM-ES-PMSw1-Pl, 2 x HM-LC-Sw1-FM, 2 x HM-LC-Sw1PBU-FM, 3 x HM-Sec-SD, 2 x HM-PB-2-WM55, 2 x HM-Sec-MDIR-2
3 x EM-1000 EM
Onewire: insgesamt 11 Onewire-Sensoren an einem LinkUSB Adapter

DerFrickler

die Lösung ist schön und ausbaubar... sicherlich ist das readingsGroup die einfachere Variante... aber warum nicht in dieser Form...

möglicher Fehler: bei mir erfolgt ein highlight eines Wertes -54,5 obwohl ein Wert -54 vorhanden ist.
mögliche Erweiterung: der Beste Wert muss nicht immer von demjenigen kommen der gerade funkt... möglicherweise könnte mal das IOdev noch mit reinnehmen.

Gruß!

fhem-challenge

#11
Hallo Daniel,

prima. Ich habe die kleinen Änderungen im Code mit eingebaut. Über einen Variable my $HTTP="http" kann nun eingestellt werden, ob man https oder http nutzt (bei https entsprechend $HTTP="https").

Gleichzeitig habe ich auch "CUL_RFR" sowie auch etwaige CCU2 als IODev mit berücksichtigt.

Ansonsten gibt es noch viele Code-Änderungen, einige BugFixes und viele Erweiterungen.

Nun kann auch jedes empfangene Device einzeln aus der Darstellung/Berechnung heraus genommen werden.
Einen Differenzdarstellung (gespeicherter RSSI Wert - aktueller RSSI Wert) ist nun möglich. Gerade das macht Sinn, da hiermit ein CUL/CUNO/HMLAN oder anderes IODev funktechnisch neu positioniert werden kann und das Ergebnis als RSSI Differenz schnell sichtbar und damit der Erfolg/oder Misserfolg der Neupositionierung deutlich wird.

Neue Version ... siehe mein erstes Posting am Anfang des Thread.


Viele Grüße!

Andreas

Zitat von: synaps-o-dan am 06 Januar 2017, 22:00:58
Hallo Andreas,
vielen lieben Dank für die Arbeit, tolle Idee und Umsetzung. Gefällt mir persönlich besser als Lösungen, die auf readingsGroup  basieren. Ich habe zwei Anmerkungen:
1. Ich benutze für SlowRF neben einem CUL einen RFRCUL. Um den ebenfalls zu erfassen, habe ich den Anfang des notify rssi_read_from_device folgendermaßen geändert:
#########################################
## Liesst die RSSI Werte aller Devices ##
#########################################
# Schreibt dieses in ein Dummy device in HTML
define rssi_read_from_device notify RSSI_Chart:(refresh|clear) { \
my @culs_cul=devspec2array("TYPE=CUL");;\
my @culs =devspec2array("TYPE=HMLAN");;\
my @culs_rfr=devspec2array("TYPE=CUL_RFR");;\
push(@culs, @culs_cul, @culs_rfr);;\

(Ab da geht es mit Deinem Original-Code weiter.  Neu / geändert sind die Zeilen mit dem @culs_rfr.)
Was hältst Du von dieser Erweiterung?

2. Die Gerätenamen in der ersten Spalte sind ja gleichzeitig Links. Ich habe den Webzugriff auf fhem mit einem Zertifikat gesichert, da funktionieren die Links nicht. Ich habe die Zeile, in der Du die Links erzeugst, wie folgt geändert:
$rssi_chart=$rssi_chart."<tr><td><div align='left'><b><a href=https://$FW_httpheader{Host}/fhem?detail=$dev target='_blank'><font color=$col>".$alias."</font></a></b></div></td>".$bestVal.$line."</tr>";;\
Geändert wurde "http" in "https". Dann funzt es auch mit https. Das müsste aber jeder User nach seinen Gegebenheiten anpassen. Vielleicht kann man das automatisieren? (Über Abfrage der Attribute HTTPS der FHEMWEBs? Da gibt es aber mehrere von...)

Viele Grüße,
Daniel

fhem-challenge

Zitat von: DerFrickler am 06 Januar 2017, 22:40:59
die Lösung ist schön und ausbaubar... sicherlich ist das readingsGroup die einfachere Variante... aber warum nicht in dieser Form...

möglicher Fehler: bei mir erfolgt ein highlight eines Wertes -54,5 obwohl ein Wert -54 vorhanden ist.
mögliche Erweiterung: der Beste Wert muss nicht immer von demjenigen kommen der gerade funkt... möglicherweise könnte mal das IOdev noch mit reinnehmen.

Gruß!

Ja, war ein Fehler, ist nun behoben. War die Rundung vor dem Komma, welches im String ausgetauscht wurde.

Viele Grüße!

Andreas

sledge

Hi Andreas,

erstmal vielen Dank für diesen "Codeschnipsel" - da ich auch unterschiedliche Systeme im Einsatz habe, ist das sehr hilfreich. Die Positionierung eines WLAN-CULs samit Jeelink-Gateway war so echt ein Kinderspiel.

Bei der Verwendung von CUL/CUN für MAX ist mir jedoch aufgefallen, dass (zumindest bei mir) lediglich die CUL_MAX in den Zeilen angezeigt werden, nicht jedoch die MAX!-Endgeräte (zB Wandthermostate oder Fensterkontakte) - siehe Anhang.

Somit habe ich zwar Homematic super im Blick, jedoch meine MAX-Geräte noch nicht so sehr. Wie man jetzt von den CUNs (für MAX) über die CUL_MAX auf die eigentlichen Devices kommt... keine Ahnung. Die Zeile für den CUL_MAX hinzugefügt

push(@culs, devspec2array("TYPE=CUL_MAX"));

war der einfache Part - aber das Internal heißt dann ja nicht "<name_des_cul>_RSSI", sondern lediglich "RSSI" - also in der Ecke

$cul_rssi="$_"."_RSSI";

zu ändern? War mir dann aber nicht sicher und wollte es nicht verbauen...

Vielleicht hast du ja eine Idee.

Gruß,

Tom

FHEM: debian Intel-NUC / 25 x MAX!, 15 x HM-bidcos, MQTT, 3 x 1wire, 20 x Shelly, 20 x Tasmota, 12 x Yeelight, Opentherm-GW, Espeasy, alexa-fhem, kodi, unifi, musiccast, ...

sledge

OK.

Hier die Änderungen ;-) Ging dann doch fix:

Hier habe ich nur den CUL_MAX hinzugefügt:

my @culs=devspec2array("TYPE=HMLAN");
push(@culs, devspec2array("TYPE=CUL"));
push(@culs, devspec2array("TYPE=CUL_RFR"));
push(@culs, devspec2array("TYPE=CUL_MAX"));
push(@culs, devspec2array("TYPE=HMCCUDEV"));



Weiter unten dann nur die Fallunterscheidung, ob es sich um einen CULMAX handelt oder nicht - bei mir geht das aus den Namenskonventionen leicht hervor - ansonsten müsste man sich erst noch TYPE holen...

foreach(@culs)
{
                        #Check if Device is a CULMAX
                        if ($_ =~ /CULMAX/)
                        {
                                $cul_rssi="RSSI";     
                        }
                        else
                        {
        $cul_rssi="$_"."_RSSI";
                        }


Für mich erzielt es das gewünschte.

Danke nochmal für den Code.
FHEM: debian Intel-NUC / 25 x MAX!, 15 x HM-bidcos, MQTT, 3 x 1wire, 20 x Shelly, 20 x Tasmota, 12 x Yeelight, Opentherm-GW, Espeasy, alexa-fhem, kodi, unifi, musiccast, ...