Auf Komponenten von Strukturen zugreifen

Begonnen von Elektrolurch, 24 Juni 2013, 09:36:23

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo zusammen,

mit meinen ersten Schritten mit fhem und perl bin ich jetzt ein Stück weitergekommen und der Erkenntnishorizont wächst .
Jetzt habe ich mal eine Frage zu Strukturen. Kann man auf die Komponenten zugreifen?
Beispiel:
define HandyMarina PRESENCE fritzbox HandyMarina 60
attr HandyMarina event-on-change-reading .*

...
#Gesamtstruktur definieren

define AlleGeraete structure Handy.* LaptopTatjana TV.* Superkiste
attr AlleGeraete clientstate_behavior relative
attr AlleGeraete clientstate_priority present absent
attr AlleGeraete event-on-change-reading .*
attr AlleGeraete room Haus


define JemandzuHause notify AlleGeraete:present {\
            FB_mail ('xxx@@xx.de' (@@xx.de'),'Jemand zu Hause','@ %');;}


define NiemandzuHause notify AlleGeraete:absent {\
     FB_mail ('xx@@xxx.de' (@@xxx.de'),'Niemand zu Hause','Bodytext zum Test');;}

Funktioniert. Ist kein Gerät vorhanden, gibt's die Mail ,,NiemandzuHause",  sobald sich ein Gerät wieder anmeldet, gibt's die Mail ,,JemandzuHause". Mit ,,@ %" gibt es den Output ,,AlleGeraete present".
Ich dachte ev., dass m die Namen und die Stati der Komponenten erhalten würde. Gibt aber nur den Output ,,AlleGeraete.* present.*".
Geht so was überhaupt mit einer Struktur? Im wiki habe ich nichts dazu gefunden.

Elektrolurchit ,,@.* %.*" man nun

configDB und Windows befreite Zone!

Dietmar63

Zitatmit meinen ersten Schritten mit fhem und perl bin ich jetzt ein Stück weitergekommen und der Erkenntnishorizont wächst .
 Jetzt habe ich mal eine Frage zu Strukturen. Kann man auf die Komponenten zugreifen?
 Beispiel:
 define HandyMarina PRESENCE fritzbox HandyMarina 60
 attr HandyMarina event-on-change-reading .*

 ...
 #Gesamtstruktur definieren

 define AlleGeraete structure Handy.* LaptopTatjana TV.* Superkiste
 attr AlleGeraete clientstate_behavior relative

Kann man auf die Komponenten zugreifen?
letztendlich ja.

Alles in fhem wird in sogenannten hashs gehalten. Es handelt sich um hashMaps wie sie in c++ genannt werden weiß ich nicht. Man kann aber sehr einfach in Perl darauf zugreifen. Fast wie auf Arrays bei denen Strings als Index erlaubt sind:

$hash{one} = "eins" schreibt auf "index" one den Text "eins".

das funktioniert sogar mehrdimensional und mit Variablen als Index:

my $three = "drei";
$hash{one}{two}{$three;} = "dieserText" macht das gleiche, nur dass es sich um ein hash von hash mit hashs handelt.

In fhem werden Geräte von Modulen verwaltet und per define definiert. Ein Modul ist wie ein Klasse in c++. Die Instanzvariablen werden in hash gehalten. In den Modulen sind Methoden definiert, die irgendetwas tun: schalten messen ...
Das Ganze ist nicht wirklich oo, kommt dem Prinzip aber schon nahe.

Um auf die Variabelen von Geräteinstanzen ... zuzugreifen gibt es Methoden, die die Elemente der verschiedenen hashs zurückliefern:
ReadingsVal($$$)
AttrVal($$$);
wären da Vertreter.
Sieh dir mal die fhem.pl an! Dort sind die Dinge ausprogrammiert.

Ich gehe oft so vor, dass ich mir überlege wie der Define, Set oder sonstwie-Befehl abgearbeitet werden könnte und versuche herauszufinden in welchem hash die Information ladet. Der Code ist jedenfalls komplett offen: Die fhem Befehle sind in fhem.pl ausprogrammiert.

Ein weiteres hash %modules sammelt beispielsweise sämtliche Instanzen der Geräte nach Gerätetyp sortiert, so dass folgender Code möglich ist:


#
sub Heating_Control_SetAllTemps() {  # {Heating_Control_SetAllTemps()}

  foreach my $hc ( sort keys %{$modules{Heating_Control}{defptr}} ) {
     my $hash = $modules{Heating_Control}{defptr}{$hc};

     if($hash->{helper}{CONDITION}) {
        if (!(eval ($hash->{helper}{CONDITION}))) {
           readingsSingleUpdate ($hash,  "state",      "inactive", 1);
           next;
        }
     }
     Heating_Control_Update($hash);
  }
}


Als Modul kenne ich besonders gut Heating_Control. Das Modul habe ich selbst erstellt und kenne jede Zeile.
Wenn du Fragen hast - nur zu!
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm