Autor Thema: [GELÖST!] Wie Array-Referenz in Elemente zerlegen?  (Gelesen 3812 mal)

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
[GELÖST!] Wie Array-Referenz in Elemente zerlegen?
« am: 03 August 2022, 19:59:22 »
Hallo zusammen.

Der Wert eines Readings ist ein Array bzw die Referenz auf ein Array.
  energy_sensors     ARRAY(0x4ba67e0)

Wie komme ich an die einzelnen Array-Elemente?
Ich habe schon diverse Möglichkeiten probiert, leider erfolglos.

@es = ReadingsVal("wb","energy_sensors","0");
@es gibt auch wieder nur ARRAY(0x4ba67e0) zurück.

Das Problem tritt auf bei dem Modul GoECharger zur Steuerung einer Wallbox (vgl. auch Screenshot).
list wallbox gibt:
Internals:
   DEF        192.168.178.33
   FUUID      62b07fd7-f33f-8be1-0d16-2cc5c08d25100297
   HOST       192.168.178.33
   INTERVAL   30
   NAME       wallbox
   NOTIFYDEV  global
   NR         1037
   NTFY_ORDER 50-wallbox
   STATE      charging
2.96 kW
   TYPE       GoECharger
   USED_API_KEYS adi afi aho alw ama amp amt ast car cbl cch cdi cfi cid dwo dws err eto lbr lch loa loe lof log lom lop lot lse tmp ust pha wak nrg
   VERSION    0.2.2
   eventCount 461
   ActionQueue:
   OLDREADINGS:
   READINGS:
     2022-08-03 12:48:52   Http_state      ready
     2022-08-03 12:48:52   KW_charging_measured 2.96
     2022-08-03 12:48:52   KW_preset_calculated 4.83
     2022-08-03 12:48:52   access_control_state access_open
     2022-08-03 12:48:52   allow_charging  0
     2022-08-03 12:48:52   amp_current     7
     2022-08-03 12:48:52   amp_limit_by_temp 32
     2022-08-03 12:48:52   amp_max16A_adapter 1
     2022-08-03 12:48:52   amp_max_cable   32
     2022-08-03 12:48:52   amp_max_wallbox 16
     2022-08-03 12:48:52   ap_password     6f52519b57
     2022-08-03 12:48:52   byPrice_min_hrs_charge 3
     2022-08-03 12:48:52   byPrice_till_oclock_charge 7
     2022-08-03 12:48:52   cable_lock_state_at_box while_car_present
     2022-08-03 12:48:52   car_state       2
     2022-08-03 12:48:52   cloud_disabled  0
     2022-08-03 12:48:52   energy_sensors  ARRAY(0x4ba67e0)                         <<< =======
     2022-08-03 12:48:52   error           0
     2022-08-03 12:48:52   kWh_charged_last 1.7
     2022-08-03 12:48:52   kWh_charged_total 341.0
     2022-08-03 12:48:52   led_brightness  5
     2022-08-03 12:48:52   led_color_chg   FF7700
     2022-08-03 12:48:52   led_color_fin   00FF00
     2022-08-03 12:48:52   led_color_idle  FFE900
     2022-08-03 12:48:52   led_save_energy 1
     2022-08-03 12:48:52   load_mgmt_cloud 0
     2022-08-03 12:48:52   load_mgmt_curramp 0
     2022-08-03 12:48:52   load_mgmt_fallbckamp 0
     2022-08-03 12:48:52   load_mgmt_grp   
     2022-08-03 12:48:52   load_mgmt_grpamp 0
     2022-08-03 12:48:52   load_mgmt_minamp 0
     2022-08-03 12:48:52   load_mgmt_prio  0
     2022-08-03 12:48:52   load_mgmt_sec   0
     2022-08-03 12:48:52   phases_available 111111
     2022-08-03 12:48:52   state           charging
     2022-08-03 12:48:52   stop_at_num_kWh 0
     2022-08-03 12:48:52   temperature     42
Attributes:
   devStateIcon disabled.*:ev_car_charger@darkgrey not_allowed.*:ev_car_charger@white ready_no_car.*:ev_car_charger@blue charging.*:ev_car_charger@darkorange waiting_for_car.*:ev_car_charger@pink finished.*:ev_car_charger@lime error.*:ev_car_charger@red
   disable    0
   event-on-change-reading .*
   event-on-update-reading state
   eventMap   /allow_charging 1:on/ /allow_charging 0:off/
   interval   30
   kW_measured_corr_value 1.00
   room       50_PV-Anlage
   stateFormat state
KW_charging_measured kW
   used_api_keys adi afi aho alw ama amp amt ast car cbl cch cdi cfi cid dwo dws err eto lbr lch loa loe lof log lom lop lot lse tmp ust pha wak nrg
   webCmd     on:off

Die Frage wurde auch schon an anderer Stelle gepostet,
https://forum.fhem.de/index.php/topic,128623.0.html ,
ist aber auf Anraten von beta-User hier besser aufgehoben.
« Letzte Änderung: 04 August 2022, 15:18:29 von DocCyber »
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

Offline Guybrush

  • Full Member
  • ***
  • Beiträge: 200
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #1 am: 03 August 2022, 20:07:17 »
schreib doch mal den Autor des Moduls an. Für mich sieht das schon komisch aus, wenn bei Type tatsächlich "]GoECharger" drin steht - also mit der eckigen Klammer. Ansonsten wo gibts das Modul? Das ist doch nicht bei Fhem dabei? kann grad nicht nachsehen...

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #2 am: 03 August 2022, 20:12:38 »
Nein, da steht in Wirklichkeit nichts mit einer eckigen Klammer.
Ich hatte versucht, den Ausdruck fett zu formatieren. Aber das geht an dieser Stelle nicht, also hab ich das Tag wieder gelöscht und dabei wohl eine Klammer vergessen.
Ich korrigiere es oben...
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #3 am: 03 August 2022, 20:31:33 »
Der Link im vorigen Post war der falsche.

Hier ist der richtige https://forum.fhem.de/index.php/topic,110282.0.html
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

Offline Guybrush

  • Full Member
  • ***
  • Beiträge: 200
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #4 am: 03 August 2022, 21:06:22 »
Dein Readings "energy_sensors" wird in dem Code so geschrieben:
}elsif($r eq 'nrg'){
my @vtmp=@{$responsedata->{'nrg'}};
$tmpr='KW_charging_measured';
$tmpv=sprintf("%.2f",$vtmp[11]/100*$kW_measured_corr_value);
readingsBulkUpdate($hash,$tmpr,$tmpv);

in den Kommentaren steht unter Verweis auf nrg => energy_sensors was davon, dass da nur das 11. Array Element davon genutzt würde. Da scheint das Readings "KW_charging_measured" das zu sein, was du willst?

dass das Readings energy_sensors auch existiert, liegt an dem direkt danach folgenden code, wo nochmal ein readingsUpdate gemacht wird, was aber im gegensatz zu den Teilen davor nicht überprüft wird:

# test if $r is known at @reading_keys and create reading ...
my %rkeys = map { $_, 1 } @reading_keys;
if( $rkeys{ $r } ){
readingsBulkUpdate($hash,$newreadingname,$v);
}

Der Wert energy_sensors ist offenbar überhaupt nur wegen dem Passus drin. Das wird jedenfalls an der Stelle nicht berücksichtigt, dass es ein Array ist. Das ist so nicht sauber umgesetzt, jedenfalls soweit ich das mal überflogen habe. Wenn du nur das Readings weg haben willst, weil es unsauber ist, kannst du da ja einfach die Zeile mit dem readingsBulkUpdate selbst so ändern:
readingsBulkUpdate($hash,$newreadingname,$v) if ($newreadingname ne "energy_sensors");

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 19647
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #5 am: 03 August 2022, 21:28:55 »
Hatte ich in dem anderen Post nicht was von VERSCHIEBEN geschrieben? Dieses Hin- und Hergeschubse zwischen zwei Threads ist GRAUSAM. Und einen "Problem-Report" im eigentlich zuständigen Thread gibt es auch nicht (obwohl es da auch schon lists gibt, an denen zu sehen ist, dass da Mist passiert!).

Anosnsten ist dieser Codeschnippsel grausam genug, um es gut sein zu lassen.

@Guybrush: Das ist einer der Gründe, warum sowas wie ein öffentlicher Peer Review mAn. sinnvoll ist.
Hier könnte man z.B.  erst den Schlüssel "nrg" rausfischen und den vorab "abfrühstücken" und dann einfach aus den weiterzuverarbeitenden Daten löschen... Jedes Mal vergleichen ist doch ineffizient ;)
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline Guybrush

  • Full Member
  • ***
  • Beiträge: 200
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #6 am: 03 August 2022, 22:02:09 »
ich hätte es auch anders gemacht, aber ist ja nunmal so drin... sieht jedenfalls nach einer gewachsenen Umsetzung aus, bei der das Konzept noch nicht von Anfang an stand. Da ich aber Hubraummonster fahre und E-Autos meide, solls nicht mein Leid sein :P Ich würd die Zeile Code so eben ändern und es dabei belassen. Ansonsten kann man es - Lust und Zeit vorausgesetzt - auch mal neu entwickeln. So lernt man fhem zumindest auch mal richtig kennen  ;D

Offline LR66

  • Full Member
  • ***
  • Beiträge: 146
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #7 am: 03 August 2022, 22:25:09 »
Sorry, in dem Modul wurde das Array des Gerätes was sich hinter nrg verbirgt, aus Aufwandsgründen (Nutzen vs  Aufwand) nicht komplett ausgwertet, das steht auch in der Hilfe:

"nrg = energy_sensors     (array, at this time only nrg[11] used for measured kW)"

D.h. es ist nicht vorgesehen, das nrg (weil Array) als ein Reading anzuzeigen, aber technisch möglich / nicht verhindert.
Es kann sich auch jeder anhand der API das Array auswerten, der Code kann auch gern angepasst werden: hatte es extra in Github abgelegt für den Fall das jmd. mitmacht oder gegenprüft und es ggf mal offiziell zu finden wäre.

PS: und ja, ich hatte das Modul als Anfänger geschrieben: es ist aus Perl-Spezi-Sicht sicher gruselig...
« Letzte Änderung: 03 August 2022, 22:33:59 von LR66 »

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 19647
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #8 am: 03 August 2022, 23:17:29 »
Zitat
PS: und ja, ich hatte das Modul als Anfänger geschrieben: es ist aus Perl-Spezi-Sicht sicher gruselig...
Sorry, war etwas vergrätzt, weil der TE hier für komplette Konfusion gesorgt hat, statt sich direkt an dich zu wenden...
Das richtete sich aber eigentlich nicht an deine Adresse - es ist völlig ok, wenn man - wie du - mehr oder weniger privat was entwickelt und es dann hier auch zur Verfügung stellt ;) .

"Das Problem" sehe ich eher darin, dass alle von allen zusammenkopieren, was grade irgendwie paßt, aber keiner sich bemüßigt fühlt, ggf. einfach auch mal zu hinterfragen, ob der Ausgangscode nur (irgendwie) funktioniert oder "gut" ist... (Und der communitiy dann an der einen oder anderen Stelle irgendwann auf die Füße fällt).

Sorry, in dem Modul wurde das Array des Gerätes was sich hinter nrg verbirgt, aus Aufwandsgründen (Nutzen vs  Aufwand) nicht komplett ausgwertet, das steht auch in der Hilfe:
Darauf hatte betateilchen auch schon in dem anderen Thread hingewiesen, was leider untergegangen ist, weil der TE nicht verstanden hatte, dass es einen großen Unterschied macht, ob man verschiebt oder einen Doppelpost macht (und den anderen dann nicht wenigstens zumacht!)...
So findet sich der "Hand-am-Arm"-Vorschlag von Guybrush jetzt wieder in einem anderen Thread und ich habe zumindest jetzt keine Lust mehr, dort dazu was zu schreiben (warum denn kein Namensarray zum loopen? Und sind die Namen "gängig"/"gut geeignet" zur Integration in das "Energieflusssystem", das hier einige mühsam zusammengeschustert haben?).

Habe fertig für heute ;D , nix für ungut...
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline Guybrush

  • Full Member
  • ***
  • Beiträge: 200
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #9 am: 03 August 2022, 23:38:46 »
warum denn kein Namensarray zum loopen? Und sind die Namen "gängig"/"gut geeignet" zur Integration in das "Energieflusssystem", das hier einige mühsam zusammengeschustert haben?).

Besser machen kann man das auf jeden Fall, aber dann fass auch den Rest an ::) War auch nur ein Beispiel und ich hab da keine Lust viel Zeit reinzustecken, weils ja nun doch was sehr spezielles ist. Anhand dessen kann er das aber sicher sich so bauen, dass er es nutzen kann.

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 19647
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #10 am: 04 August 2022, 10:36:50 »
Das ist ja super!
Vielen herlichen Dank für deine Mühe.
Ich probieres es mal.
Falscher Forenbereich ::) .
Hier mal der Versuch einer "kompakten Version", die gleich das mit dem Array-Reading erschlägt...:
        } elsif ( $r eq 'nrg' ) {
            my @vtmp=@{$responsedata->{nrg}};
            $vtmp[11] = sprintf("%.2f",$vtmp[11]/100*$kW_measured_corr_value); # Wert korrigieren und im Array behalten...
            my @rnms = qw (Spannung_L1 Spannung_L2 Spannung_L3 Spannung_N Ampere_L1 Ampere_L2 Ampere_L3 Leistung_L1 Leistung_L2 Leistung_L3 Leistung_N KW_charging_measured COS_L1 COS_L2 COS_L3 COS_N ); #Array für die Namen; dann ist es auch einfacher, die an einer Stelle zu ändern oder ggf. zu internationalisieren!
            for (0..15) {
                readingsBulkUpdate($hash,$rnms[$_], $vtmp[$_]);
            }
            delete $responsedata->{nrg};
Könnte man noch anreichern um eine Attributanfrage, anhand der geklärt wird, ob nur das eine Reading geschrieben werden soll, oder eben alles.

Just my2ct.
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #11 am: 04 August 2022, 10:41:04 »
Sorry, war etwas vergrätzt, weil der TE hier für komplette Konfusion gesorgt hat, statt sich direkt an dich zu wenden...
Woher weißt du eigentlich, dass das nicht geschehen ist?

Ich begrüße ich den Einsatz und die Unterstützung der Forumsteilnehmer. In den allermeisten Fällen findet man Hilfe und man kann hin und wieder auch selbst andere unterstützen. 
Unschön finde ich jedoch die teils sehr selbstgefällige Art Einzelner, die alles zu wissen und zu können scheinen und daraus offenbar für sich den Anspruch ableiteten, weniger kenntnisreiche Teilnehmer ziemlich von oben herab behandeln zu dürfen.
Ich halte das - freundlich ausgedrückt -  für einen ziemlich schlechten Stil.

Zitat
... weil der TE nicht verstanden hatte, dass es einen großen Unterschied macht, ob man verschiebt oder einen Doppelpost macht ...
So ein Stuss.
Ich hatte explizit danach gefragt, wie man verschiebt und was man tun soll. Keine Antwort erhalten ...
Es wird zwar nicht richtig und/oder nicht alles gelesen, aber das ist wohl nicht so wichtig.  Hauptsache, man kann sich wieder produzieren...
Genau das meinte ich.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 19647
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #12 am: 04 August 2022, 10:50:10 »
Sorry, hatte
Hab's doch gefunden ...
dann wohl missverstanden. Den Verschiebe-Knopf findet man unten unter dem ersten Beitrag.

Ansonsten Danke auch für deine offenen Worte und bitte dich und auch die anderen hier Beteiligten um Verzeihung, falls ich ihnen zu sehr auf die Füße getreten sein sollte.
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #13 am: 04 August 2022, 11:00:51 »
Sorry, hatte dann wohl missverstanden. Den Verschiebe-Knopf findet man unten unter dem ersten Beitrag.

Ansonsten Danke auch für deine offenen Worte und bitte dich und auch die anderen hier Beteiligten um Verzeihung, falls ich ihnen zu sehr auf die Füße getreten sein sollte.


Okay - schon vergessen und erledigt.

(Es ist nicht leicht, sich zu entschuldigen. Es zeugt von Größe, wenn man es trotzdem macht. Klasse!)
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 19647
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #14 am: 04 August 2022, 11:10:49 »
Danke!

Noch eine Anmerkung zum Thema "Verschieben": Das macht Sinn, wenn man Dinge inhaltlich zusammenhalten möchte. Es macht aber uU. dann Probleme, wenn man bestimmte Maintainer auf Probleme aufmerksam machen will, insbesondere Rudi. Verschieben erzeugt nämlich keine Benachrichtigung (per Email), im Unterschied zur Neuanlage, wenn man als User/Maintainer die Benachrichtigungsfunktion für den betreffenden Forenbereich aktiviert hat. (MAn. nur) dann ist (ausnahmsweise!) schließen und an anderer Stelle neu beginnen die bessere Variante.
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline DocCyber

  • Full Member
  • ***
  • Beiträge: 491
Antw:Wie Array-Referenz in Elemente zerlegen?
« Antwort #15 am: 04 August 2022, 11:22:26 »
Okay.

Bis dato war ich noch nicht in der Situation, etwas verschieben zu müssen. Aber für die Zukunft weiß ich nun Bescheid.

Jedenfalls danke ich für deinen Input.  :)
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

 

decade-submarginal