Hallo zusammen,
ich möchte über eine Funktion alle Devices mit dem Type "HeatingThermostat" auswerten und dachte, dass ich das über das Hash %defs machen kann. Da streikt FHEM/Perl aber und möchte, dafür ein eigenes Package haben. Als Alternative habe ich mir bisher mit dem Funktionsaufruf {fhem(list TYPE=MAX)} geholfen, über dessen Rückmeldung ich dann nacheinander mit InternalVal den Type abgefragt habe.
Nun habe ich aber festgestellt, dass jeder dieser Funktionsaufrufe die Liste der MAX-Devices auch ins Log schreibt. Bei einer zyklischen Funktion natürlich unsinnig.
Daher meine Frage, ob das von Euch schon jemand anders/besser gelöst hat? Freue mich über jede Rückmeldung.
Gruß,
F.
my $devs = devspec2array("TYPE=MAX");
Damit hast Du Dein Array bestehend aus MAX Devices und kannst auf jedes Reading oder Internal zugreifen.
Gruß
Dan
Oder so das Loggen unterdrücken:
{fhem("list TYPE=MAX",1)}
Gruß
Hans
...wunderbar, danke für die beiden tollen Tipps!
Kurze Nachfrage noch: Gibt es auch die Möglichkeit, mir alle Geräte eines Raumes (und idealerweise dann noch nach Type gefiltert) über eine Funktion ausgeben zu lassen?
Vielen Dank noch mal und Gruß,
F.
Es funktionieren alle FILTER.
my $devs = devspec2array("room=Badezimmer");
oder
my $devs = devspec2array("TYPE=MAX:FILTER=room=Badezimmer");
Gruß
Dan
Das ist ja klasse und hilft mir sehr - und vielen Dank für die blitzschnelle Antwort :)!
...ok, hoffentlich letzte Nachfrage: Mit
{devspec2array("room=.*")}
bekomme ich nicht wie erhofft eine Liste aller Räume, sondern aller Devices in allen Räumen. Gibt es da noch eine Möglichkeit, eine Liste der Räume zu bekommen?
Vielen Dank und Gruß,
F.
So ohne weiteres nicht!
Mit ein Wenig Perl geht das fix.
Code für 99_myUtils (ungetestet):
sub listAllRooms(;$)
{
my ($type) = @_;
my @rooms;
foreach my $dev (devspec2array(".*"))
{
foreach my $room (split(",",AttrVal($dev,"room","")))
{
push @rooms,$room if (!grep(/^$room$/,@rooms));
}
}
return join(",",sort @rooms) if ($type eq "list");
return \@rooms;
}
Dann die Funktion aufrufen mit:
{ listAllRooms }
um ein Array zurück zu bekommen oder:
{ listAllRooms("list") }
um eine kommaseparierte Liste zu erhalten.
Gruß
Dan
EDIT: Hab nochmal ergänzt dass die Raumliste sortiert wird.
Wow, vielen Dank! Ich hätte mir sonst auch was in Perl zusammengestrickt, aber sicher nicht so elegant :)!
Wenn es funktioniert und Deine Anforderungen erfüllt ist es doch super.
Und wenn Du dabei noch etwas gelernt hast, ist es noch besser!!! 8)
Gruß
Dan
Natürlich :) - aber trotzdem ist so schnelle und hilfreiche Reaktion ja nicht selbstverständlich, insofern noch mal vielen Dank :)!