Array oder Liste mit Fensterkontakten in Perl erstellen

Begonnen von Samsi, 19 Januar 2013, 23:44:09

Vorheriges Thema - Nächstes Thema

Samsi

Hallo,

ich habe etliche Fensterkonatakte, die fangen alle mit kontakte_....  an.
Kann ich die alle irgendwie mit einer RegExp in ein Array bekommen z.B.:

$kont =  kontakte_*;

Danach will ich das Array in einer Schleife durchlaufen und z.B. den Namen aller Kontakte ausgeben, welche nicht geschlossen sind.

Gibt es da eine einfache Möglichkeit in Perl?
FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Zrrronggg!

http://www.fhemwiki.de

Suche nach "array"

Da gibts genug Codesnippets, die Arrays verwenden, vielleicht passt ja was.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Tobias

oder einfach mit ner schleife durch $defs laufen und bei "kontakte_*" ein push(@array)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Samsi

Hallo,

$defs hat mir schon mal geholfen, jetzt weiss ich wenigstens wo ich die kontakte herbekomme . Ich habe dann noch auf ein paar Perl Seiten den Befehl grep gefunden mit dem ich das Array $defs durchsuchen können müsste und ein neues Array zurückbekommen sollte, aber leider bekomme ich immmer nur eine Fehlermeldung. Mit perl kenn ich mich aber auch überhaupt noch nicht aus:

my @kontakte = grep (/kontakte*/,$defs);

ergibt als Fehler:

Global symbol "$defs" requires explicit package name at ./FHEM/99_myUtils.pm line 18


Erst habe ich gedacht, das ich auf $defs nicht zugreifen kann, weil es in einem anderen modul definiert ist, aber ein

$defs{'motionWZ'} gibt mir ein HASH(0xa8a1b0) zurück (ich nehme mal an das ist das von mir gewünschte Objekt also mein motionWZ device).

Googlen hat mich jetzt leider auch nicht mehr weiter gebracht.

Vielleicht kann mir noch jemand einen Tipp geben.



FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Tobias

soetwas in der art:
my $a;
foreach (my $i keys(@defs)){
  if($defs[$i] =~ m/^kontakt_(.*)$/i) {
    push(@a, $i);
    Log 3, "Ein Kontakt: $i";
  }
}


Im Array @a ist dann die Liste der Kontakte
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Samsi

Hallo Tobias,

danke schon mal für Deine  Geduld ;) aber ich schaff es damit auch nicht. Ich hab mit Deinem code auch nur fehlermeldungen bekommen, also habe ich mal versucht, das ganze auf ein Minimum zu reduzieren.Damit hab ich es mit der Perl Dokumentation zumindest geschafft, die foreach Schleife fehlerfrei hin zu bekommen:


sub test()
{
my $a;
 foreach my $i (keys(%defs))
  {
   #if($defs[$i] =~ m/^kontakt_(.*)$/i)
   {
    #push(@a, $i);
    Log 3, "Ein Kontakt: $i";
   }
  }
}

Ohne das if werden zumindest schon mal alle Definitionen ins logfile geschrieben.

Mit dem IF bekomme ich wieder den Fehler: Global symbol "@defs" requires explicit package name at ./FHEM/99_motionUtils.pm line 23.

Viele Grüße




FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Tobias

war ja auch nur aus dem Kopf, keine gewähr auf Richtigkeit, musst in den einschlägigen Perl-Dokus stöbern.

Aber versuch mal folgendes:

if($i =~ m/^kontakt_(.*)$/i)


Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Samsi

Danke damit klappt es und jetzt ist mir auch klar  geworden warum.
FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Zrrronggg!

Und jetzt die komplette Lösung mit ein bisschen erklärendem Text als CodeSnippet ins Wiki. Das wäre doch was!
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

justme1968

wäre es nicht besser über den device typ zu gehen als über den namen?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Samsi

Wenn Device Typ so etwas wie das Model ist (HM-SEC-SC) dann hast Du recht (zumindest für meinen Zweck, wenn jemand aber vielleicht 1OG und EG getrennt auswerten will dann kommt er über den Typ alleine nicht weit ), aber als Anfänger hab ich da gar nicht dran gedacht. Ich wüsste jetzt aber auch nicht wie ich auf den Device Typ/Model zugreifen kann. So weit bin ich noch nicht mit FHEM vertraut.
FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Zrrronggg!

Das würde ich eigentlich eher nicht machen. Denn gerade Fensterkontakte kann man wegen des extern anbindbaren Schalters auch für andere Dinge verwenden. Ich verwende die z.b. als Glasbruchsensoren, jemand anders hier im Forum zur Überwachung einer Pumpe, wenn ich mich recht erinnere.
Ich finde eine strukturierte Benennung und Abfrage nach Namen flexibler. Den Namen eines Gerätes kann man immer ändern, wenn es aus der Betrachtung mal ausgenommen werden soll, den Device TYPE aber nicht.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

justme1968

ich bin gerade nur von meinen fenster griff Kontakten ausgegangen. die sind wirklich nur dafür. wenn es andere sensoren sind die für etwas anders werwendert werden geht das sicher nicht. dann würde ich versuchen über group zu gehen. und alles was den gleichen zweck hat in die gleiche gruppe tun. ich bin einfach der meinung das der name einen anderen zweck hat. aber ich bin ja auch der meinung meinung das noch ein mechanismus fehlt um objekte abstrakt zuzuordnen. also z.b. einen fenstergriff zu einem fenster zu einem rolladen. aber das schweift gerade ab :)

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968