2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-15 03:59:11 +00:00

10_MQTT2_DEVICE.pm: Some more pictures (Forum #91394)

git-svn-id: https://svn.fhem.de/fhem/trunk@18005 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2018-12-19 20:51:59 +00:00
parent 466dc53e13
commit ccac5e6f97
2 changed files with 110 additions and 23 deletions

View File

@ -26,9 +26,11 @@ MQTT2_DEVICE_Initialize($)
autocreate:0,1
bridgeRegexp:textField-long
devicetopic
devPos
disable:0,1
disabledForIntervals
getList:textField-long
imageLink
jsonMap:textField-long
model
readingList:textField-long
@ -290,6 +292,7 @@ MQTT2_DEVICE_Set($@)
my ($sets,$cmdList) = MQTT2_getCmdHash(AttrVal($hash->{NAME}, "setList", ""));
my $cmdName = $a[1];
return MQTT2_DEVICE_addPos($hash,@a) if($cmdName eq "addPos"); # hidden cmd
my $cmd = $sets->{$cmdName};
return SetExtensions($hash, $cmdList, @a) if(!$cmd);
return undef if(IsDisabled($hash->{NAME}));
@ -459,24 +462,37 @@ MQTT2_DEVICE_fhemwebFn($$$$)
{
my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn.
return if(!ReadingsVal($d, ".graphviz", ReadingsVal($d, "graphviz", "")));
my $js = "$FW_ME/pgm2/zwave_neighborlist.js";
return
"<div id='ZWDongleNr'><a id='zw_snm' href='#'>Show neighbor map</a></div>".
"<div id='ZWDongleNrSVG'></div>".
"<script type='text/javascript' src='$js'></script>".
'<script type="text/javascript">'.<<"JSEND"
\$(document).ready(function() {
\$("div#ZWDongleNr a#zw_snm")
.click(function(e){
e.preventDefault();
zw_nl('MQTT2_DEVICE_nlData("$d")');
});
});
</script>
if(ReadingsVal($d, ".graphviz", ReadingsVal($d, "graphviz", ""))) {
my $js = "$FW_ME/pgm2/zwave_neighborlist.js";
return
"<div id='ZWDongleNr'><a id='zw_snm' href='#'>Show neighbor map</a></div>".
"<div id='ZWDongleNrSVG'></div>".
"<script type='text/javascript' src='$js'></script>".
'<script type="text/javascript">'.<<"JSEND"
\$(document).ready(function() {
\$("div#ZWDongleNr a#zw_snm")
.click(function(e){
e.preventDefault();
zw_nl('MQTT2_DEVICE_nlData("$d")');
});
});
</script>
JSEND
}
my $img = AttrVal($d, "imageLink", "");
if($img) {
return
"<div id='m2dimage' class='img' style='float:right'>".
"<img style='max-width:96;max-height:96px;' src='$img'>".
"</div>".
'<script type="text/javascript">'.<<'JSEND'
$(document).ready(function() {
$("div#m2dimage").insertBefore("div.makeTable.internals"); // Move
});
</script>
JSEND
}
}
sub
@ -484,17 +500,54 @@ MQTT2_DEVICE_nlData($)
{
my ($d) = @_;
my %h;
my (%dv,%h,%n2n);
my $fo="";
my $pref = "https://koenkk.github.io/zigbee2mqtt/images/devices/";
# Needed for the image links
my $dv = ReadingsVal($d, ".devices", ReadingsVal($d, "devices", ""));
for my $l (split(/[\r\n]/, $dv)) {
next if($l !~ m/ieeeAddr":"([^"]+)".*model":"([^"]+)"/);
$dv{$1} = $2;
}
# Name translation
for my $n (devspec2array("TYPE=MQTT2_DEVICE")) {
my $cid = $defs{$n}{CID};
next if(!$cid);
$cid =~ s/zigbee_//;
$n2n{$cid} = $n;
}
my $gv = ReadingsVal($d, ".graphviz", ReadingsVal($d, "graphviz", ""));
for my $l (split(/[\r\n]/, $gv)) {
if($l =~ m/^\s*"([^"]+)"\s*\[label="([^"]+)"\]/) {
my ($n,$v) = ($1,$2);
$v =~ s/[{}]//;
$v =~ s/\|/<br>/g;
my $nv = $n;
$nv =~ s/^0x0*//;
$h{$n}{img} = '';
if($v =~ m/{(.*)\|(.*)\|(.*)\|(.*)}/) {
my ($x1,$x2,$x3,$x4) = ($1,$2,$3,$4);
$nv = $n2n{$x1} if($n2n{$x1});
$h{$n}{img} = $pref.$dv{$n}.".jpg" if($dv{$n});
if($dv{$n} && $n2n{$x1} && !AttrVal($n2n{$x1}, "imageLink", "")) {
CommandAttr(undef, "$nv imageLink $h{$n}{img}");
}
$h{$n}{class} = ($x2 =~ m/Coordinator|Router/ ? "zwDongle":"zwBox");
if($x2 =~ m/Coordinator/) {
$nv = $d;
$fo = $n;
}
} else {
$h{$n}{class}="zwBox";
}
$v =~ s/[{}]//;
$v =~ s/\|/<br>/g;
$h{$n}{txt} = $nv;
$h{$n}{title} = $v;
$fo = $n if(!$fo);
my @a;
@ -504,20 +557,39 @@ MQTT2_DEVICE_nlData($)
push @{$h{$1}{neighbors}}, $2;
}
}
my @ret;
my @dp = split(" ", AttrVal($d, "devPos", ""));
my %dp = @dp;
for my $k (keys %h) {
my $n = $h{$k}{neighbors};
push @ret, '"'.$k.'":{'.
'"class":"zwBox col_link col_oddrow",'.
'"class":"'.$h{$k}{class}.' col_link col_oddrow",'.
'"img":"'.$h{$k}{img}.'",'.
'"txt":"'.$h{$k}{txt}.'",'.
'"title":"'.$h{$k}{title}.'",'.
'"pos":[],'.
'"pos":['.($dp{$k} ? $dp{$k} : '').'],'.
'"neighbors":['. (@{$n} ? ('"'.join('","',@{$n}).'"'):'').']}';
}
return '{"firstObj":"'.$fo.'","el":{'.join(",",@ret).'} }';
my $r = '{"firstObj":"'.$fo.'","el":{'.join(",",@ret).'},'.
'"saveFn":"set '.$d.' addPos {1} {2}" }';
return $r;
}
sub
MQTT2_DEVICE_addPos($@)
{
my ($hash, @a) = @_;
my @d = split(" ", AttrVal($a[0], "devPos", ""));
my %d = @d;
$d{$a[2]} = $a[3];
CommandAttr(undef,"$a[0] devPos ".join(" ", map {"$_ $d{$_}"} sort keys %d));
}
# graphvis end
#####################################
#####################################
# Utility functions for the AttrTemplates
sub
@ -625,6 +697,13 @@ zigbee2mqtt_devStateIcon255($)
name of the device.
</li><br>
<a name="devPos"></a>
<li>devPos value<br>
used internally by the "Show neighbor map" visualizer in FHEMWEB.
This function is active if the graphviz and devices readings are set,
usually in the zigbee2mqtt bridge device.
</li><br>
<li><a href="#disable">disable</a><br>
<a href="#disabledForIntervals">disabledForIntervals</a></li><br>
@ -658,6 +737,12 @@ zigbee2mqtt_devStateIcon255($)
</li><br>
<a name="imageLink"></a>
<li>imageLink href<br>
sets the image to be shown. The "Show neighbor map" function initializes
the value automatically.
</li>
<a name="jsonMap"></a>
<li>jsonMap oldReading1:newReading1 oldReading2:newReading2...<br>
space or newline separated list of oldReading:newReading pairs.<br>

View File

@ -61,6 +61,8 @@ zw_nl(fhemFn)
var el = fnRet.el[eName];
if(el.pos[0] != el.x || el.pos[1] != el.y) {
log("SavePos:"+eName);
el.x = Math.round(el.x*100)/100;
el.y = Math.round(el.y*100)/100;
el.pos[0] = el.x; el.pos[1] = el.y;
var cmd = sprintf(fnRet.saveFn, eName, el.x+","+el.y);
FW_cmd(FW_root+"?cmd="+cmd+"&XHR=1");