FHEM Forum

FHEM => Automatisierung => Thema gestartet von: derHeimwerker am 11 Dezember 2017, 11:18:37

Titel: Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 11 Dezember 2017, 11:18:37
Hallo,

ich möchte eine Perl Routine schreiben, die mir aus einem übergebenen Device alle Attribute,
in denen "Zeit" vorkommt, in zwei Readings (Stunde, Minute) aufteilt. Ich kann hier gerade
nur "Drockenübungen" machen, da ich gerade keinen Zugang zur fhem Umgebung habe.

Kann das so in etwa funktionieren und wie bekomme ich die Attribute mit "*Zeit*" heraus gefiltert ?


my $dev = @_;


my @attr = AttrVal($dev, --> wie finde ich hier die Attribute mit *Zeit ?

foreach (@attr) {

   my @zeit = split(/:/,$attr);

   my $stunde = sprintf("%02d",$zeit[0]);
   my $minute = sprintf("%02d",$zeit[1]);

   my $reading_stunde = $attr.'_Stunde'; --> Ergebnis soll sein : "ZeitAttribut_stunde"
   my $reading_minute = $attr.'_minute'; --> Ergebnis soll sein : "ZeitAttribut_minute"


   fhen("setreading $dev $reading_stunde $stunde");
   fhen("setreading $dev $reading_stunde $stunde");
}





Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: betateilchen am 12 Dezember 2017, 14:05:33
Nicht mit array, sondern mit hash arbeiten :)

my $a = $attr{$dev};

liefert "return Dumper $a" für "global" z.B. sowas:



$VAR1 = {
          'nrarchive' => '3',
          'commandref' => 'modular',
          'userattr' => 'DbLogExclude DbLogInclude cmdIcon devStateIcon devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride',
          'statefile' => './log/fhem.save',
          'mseclog' => '1',
          'version' => 'fhem.pl:15522/2017-11-29',
          'room' => '99 System',
          'group' => '00 System',
          'devStateIcon' => 'no.*:icoEverything',
          'logfile' => './log/fhem-%Y-%m-%d_%H.log',
          'motd' => 'none',
          'modpath' => '.',
          'configfile' => 'configDB',
          'verbose' => 4
        }



dann kannst Du über den gesamten hash loopen und per regexp prüfen, ob der Attributname "Zeit" enthält.
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 12 Dezember 2017, 18:40:57
erst einmal vielen Dank. Leider habe ich das so nicht ganz verstanden. Kannst du das etws detaillierter erklären ?
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: CoolTux am 12 Dezember 2017, 18:48:34
Noch genauer kann man es eigentlich nicht erklären


my $a = $attr{$dev};


$attr ist ein globaler Hash. Wenn du für $dev den Namen Deines Devices an gibst bekommst Du ein Hash mit allen Attributen des Devices $a
In diesem Hash kannst du nun suchen
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 12 Dezember 2017, 18:52:48
Ah ... das mit dem globalen Hash wusste ich  nicht. Jetzt wird es klarer .
Danke !
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: betateilchen am 13 Dezember 2017, 11:38:10
Zitat von: CoolTux am 12 Dezember 2017, 18:48:34
$attr ist ein globaler Hash

Falsch... %attr ist der hash ;)
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: CoolTux am 13 Dezember 2017, 11:41:45
Zitat von: betateilchen am 13 Dezember 2017, 11:38:10
Falsch... %attr ist der hash ;)

Ja Du hast Recht.

Wie genau nennt man am besten diese Konstellation.
$attr{$dev};

%attr ist der Hash und $attr{} ist der ??


Danke Dir
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: betateilchen am 13 Dezember 2017, 11:46:35
Zitat von: CoolTux am 13 Dezember 2017, 11:41:45
$attr{}

"$attr{irgendwas}" ist auch ein hash, nämlich die Teilmenge aus dem hash "%attr" mit dem key "irgendwas"

Aber "$attr" alleine ist kein hash, sondern eine Variable.
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: CoolTux am 13 Dezember 2017, 11:49:16
Ah ok, jetzt verstehe ich was du meinst.
Es fehlte also die ganze Menge $attr{} ist ein Hash.

Bin da ganz bei Dir. Wenn man schon erklärt sollte man es auch korrekt machen. DankeDir
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: betateilchen am 13 Dezember 2017, 13:19:02
Zitat von: CoolTux am 13 Dezember 2017, 11:41:45
Wie genau nennt man am besten diese Konstellation.

%attr ist der Hash und $attr{} ist der ??

Jetzt ist mir der Begriff wieder eingefallen: $attr{} bezeichnet ein "Hashelement"

Ein Hashelement kann natürlich selbst wieder einen hash beinhalten, diese lassen sich beliebig tief schachteln.
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: CoolTux am 13 Dezember 2017, 13:32:18
Das Wort kommt mir bekannt vor. Habe ich schon des öfteren gelesen.
Danke Dir fürs Bescheid geben.
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 14 Dezember 2017, 13:27:27
Verstehe ich das denn richtig, dass das hash %attr weitere hash beinhaltet ?

In etwa so : %attr = (device1 => {attr1 => wert1,
                                                    attr2 => wert2}
                               
                                 device2 => {attr3 => wert3,
                                                     attr4 => wert4}


Ansonsten könnte ich ja nicht mit $attr{device1} auf  attr1 => wert1 zugreifen. Oder ??
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: betateilchen am 14 Dezember 2017, 20:09:28
Bitte perl Doku zum Thema hash lesen. Das ist kein FHEM spezifisches Thema.

Danke.
Titel: Antw:Perl Routine: Aus "Zeit"Attribut userReadings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 15 Dezember 2017, 07:48:11
Das sollte auch keine große Fach-Diskussion werden. Ich wollte lediglich wissen, ob ich das , nach dem Studieren der perl Doku zum Thema "Hashes of Hashes" , richtig verstanden habe.

Trotzdem Danke für die Hilfe !
Titel: Antw:[GELÖST]Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: dev0 am 15 Dezember 2017, 09:40:04
Schau Dir den %attr hash einfach selbst an. Per telnet oder FHEM Eingabezeile:

{use Data::Dumper;; Dumper \%attr}
Titel: Antw:[GELÖST]Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 15 Dezember 2017, 10:21:36
 :) cool !! Danke. So hatte ich mir das vorgestellt !
Titel: Antw:[GELÖST]Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 18 Dezember 2017, 14:25:52
Dank eurer Hilfe, bekomme ich die Attribute jetzt ausgewertet und ich kann entsprechende Readings anlegen.
Jetzt möchte ich noch alle Readings eines Device auslesen bzw. mit Wildcards "*Zeit*" ausgeben.

Stehen die auch in einem globalen Hash ?

Titel: Antw:[GELÖST]Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: dev0 am 18 Dezember 2017, 15:32:35
https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Readings
https://fhem.de/commandref.html#perl
Titel: Antw:Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 18 Dezember 2017, 22:05:01
Ich bin wieder einen Schritt weiter :-)
So funktioniert meine Routine:

sub test($) {
my $dev = @_;
    foreach my $readings (keys %{$defs{'Roll.Kueche'}{READINGS}}) {
   if ($readings =~ /Auto/) {
  Log 1, ("$readings gefunden");
   }
   }
}


So leider nicht:

sub test($) {
my $dev = @_;
    foreach my $readings (keys %{$defs{$dev}{READINGS}}) {
   if ($readings =~ /Auto/) {
  Log 1, ("$readings gefunden");
   }
   }
}


Aufruf der Funktion über : {test("Roll.Kueche")}

Wo liegt mein Fehler ?
Titel: Antw:Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: dev0 am 19 Dezember 2017, 10:29:08
my ($dev) = @_;
Ohne Klammern bekommst Du nur die Anzahl der Arrayelemente geliefert.
Titel: Antw:Perl Routine: Aus ZeitAttribut Readings Stunde und Minute exportieren
Beitrag von: derHeimwerker am 20 Dezember 2017, 10:40:19
Klasse ! Auch das hat funktioniert. Danke !