Hauptmenü

Attribute in Array

Begonnen von TWART016, 08 August 2023, 02:54:27

Vorheriges Thema - Nächstes Thema

TWART016

Hallo,

die Readings von einem Gerät kann ich relativ einfach in ein Array speichern.
my $devhash = $defs{"myDevice"};
my $reading = $devhash ->{READINGS};

Ist das auch mit einem Attribute möglich?

Ich würde gerne von einem Gerät alle Attribute mit vw_.* einlesen und weiter verarbeiten.

Beta-User

Zitat von: TWART016 am 08 August 2023, 02:54:27Ist das auch mit einem Reading möglich?

Ich würde gerne von einem Gerät alle Attribute mit vw_.* einlesen und weiter verarbeiten.
Warum es im Thread-Titel und in der Abschlussfrage plötzlich um Attribute geht, werde ich vermutlich in diesem Leben nicht mehr verstehen, aber wenn du "alle Readings" schon in einem Array hast, kannst du doch
- eine Schleife drüberlaufen lassen, nur die "relevanten" keys bearbeiten und den Rest einfach mit einem "next" belassen as is?
- ein "grep" verwenden, um ein neues Array zu bilden, das nur die passenden Readings (!) erfaßt und dann mit diesem weiterarbeiten?

    for (@rows) {
    # Nur Zeilen mit gesuchten Identifier verwenden
        next if $_ !~ qr/^$key=/ix;
 
 
my @shortL  = grep { m{\Avw_}x } keys %{$reading};Oder direkt nur die gewollten Readings rausgreppen in das Ausgangsarray (das bekommst du selbst hin, oder?)....
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Warum es im Thread-Titel und in der Abschlussfrage plötzlich um Attribute geht,
Weil viele user "reading" und "attribute" genauso wenig differenzieren wie "device" und "module".

Aber das, was der TE da mit seinem Codeschnipsel produziert, ist als Ergebnis kein array, sondern wieder ein hash.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TWART016

Sorry, hatte mich verschrieben. Ich möchte die Attribute einlesen und weiterverarbeiten. Ob das mit einem Array ist oder ein anderer Weg ist mir eigentlich egal.

Beta-User

Es wäre einfacher, wenn du den Gesamtzusammenhang darstellen würdest, um den es eigentlich geht, das würde das Raten drumrum reduzieren.
Unabhängig von allem anderen ist es wenig empfehlenswert, direkt auf die internen Datenstrukturen zuzugreifen bzw. darauf zu referenzieren, weil das fehleranfällig ist und ggf. erwartete (FHEM-) Funktionalität umgeht.

Es gibt aber (teilweise) Frontend-Funktionen für sowas. Hiermit bekommt man z.B. eine Leerzeichen-separierte Liste zur weiteren Verarbeitung (allerdings mit den vorgesehenen Wertebereichen bzw. Widgets):
{getAllAttr('DeinDevice')}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TWART016

Beim Parken bekomme ich Koordinaten zurück. Dafür möchte ich ein Reading haben, wo das genau ist, z.B. Home, Arbeit, Einkaufen, ...

Dafür möchte ich den Bereich als Koordinaten definieren und dann abfragen, ob der Punkt in dem Bereich liegt.

Dafür habe ich derzeit userattr erstellt
attr vw_standorte vw_Standort_1 Home,48.aaaaaa,9.bbbbbb,48.cccccc,9.dddddd
attr vw_standorte vw_Standort_2 Arbeit,48.eeeeee,9.ffffff,48.gggggg.hhhhhh

Daher muss ich jedes der Attibute mit vm_.* einlesen. Leerzeichen-separierte finde ich immer sehr unübersichtlich, da wären mit Zeilen schon lieber.

Beta-User

Zitat von: TWART016 am 09 August 2023, 12:31:50Beim Parken bekomme ich Koordinaten zurück. Dafür möchte ich ein Reading haben, wo das genau ist, z.B. Home, Arbeit, Einkaufen, ...
Dafür möchte ich den Bereich als Koordinaten definieren und dann abfragen, ob der Punkt in dem Bereich liegt.
Dafür habe ich derzeit userattr erstellt
attr vw_standorte vw_Standort_1 Home,48.aaaaaa,9.bbbbbb,48.cccccc,9.dddddd
attr vw_standorte vw_Standort_2 Arbeit,48.eeeeee,9.ffffff,48.gggggg.hhhhhh
Danke. So wird das schon verständlicher, wo das "hinsoll".
ZitatDaher muss ich jedes der Attibute mit vm_.* einlesen. Leerzeichen-separierte finde ich immer sehr unübersichtlich, da wären mit Zeilen schon lieber.
Du musst es ja nicht lesen können, sondern einfach nur auswerten...
my @allAttr = split m{[\s,]+}x, getAllAttr('vw_standorte');
for my $single (@allAttr) {
    next if $single !~ qr/^vw_Standort/ix;
    my (loc, minlat, minlong, maxlat, maxlong) = split m{,}x, AttrVal('vw_standorte',$single,'none');
    next if $loc eq 'none';
    next if !looks_like_number($minlat);
    ....deinfancycode....
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors