Klar, kann man auch machen! Sorry, hatte da nicht mehr dran gedacht.
Aber eigentlich steht ja die IP schon im Internal "IODev_CONN", dort allerdings noch mit Pre- und Suffix.
Von mir aus kann die IP aber auch noch in ein Reading geschrieben werden. Dann würde ich das Reading allerdings nur neu schreiben wenn es sich auch geändert hat, denn es ist ja im Normalfall nicht davon auszugehen dass sich die IP bei jedem Abruf ändert.
sub WLED_get {
my $dev = shift // return;
my $event = shift // undef;
my $c;
my $h = {
sx => 'speed',
ix => 'intensity',
fp => 'palette',
fx => 'effect',
ps => 'preset'
};
for (keys %{$h}) {
next if $event !~ m/(?<=<$_>)([\d]+)(?=<\/$_>)/x;
if ($1 != ReadingsNum($dev,$h->{$_},-2)){
$c->{$h->{$_}} = $1;
}
}
my $io = InternalVal($dev,'LASTInputDev',AttrVal($dev,'IODev',InternalVal($dev,'IODev',undef)->{NAME})) // return defined $event ? $c : undef;
my $ip = InternalVal($dev,$io.'_CONN',ReadingsVal($dev,'ip', undef)) =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/x ? $1 : return defined $event ? $c : undef;
HttpUtils_NonblockingGet({
url=>"http://$ip/json",
callback=>sub($$$){
my ($hash,$err,$data) = @_;
WLED_setReadings($dev,$data,$ip);
}
});
return defined $event ? $c : undef;
}
sub WLED_setReadings {
my $dev = shift // return;
my $data = shift // return;
my $ip = shift // return;
my $fx = $data =~ m/effects..\[([^[]*?)]/x ? WLED_subst($1) : '';
my $pl = $data =~ m/palettes..\[([^[]*?)]/x ? WLED_subst($1) : '';
my $hash = $defs{$dev};
my @f = split(',',$fx);
my @p = split(',',$pl);
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,'effectname',$f[ReadingsNum($dev,'effect',0)]);
readingsBulkUpdate($hash,'palettename',$p[ReadingsNum($dev,'palette',0)]);
readingsEndUpdate($hash,1);...