devspec2array funktioniert im neuen Modul nicht wie erwartet

Begonnen von t1me2die, 18 September 2018, 07:15:27

Vorheriges Thema - Nächstes Thema

t1me2die

Moin liebes Forum,

ich sitze an meinem ersten eigenen Modul und habe ein Problem mit "devspec2array".

Ich möchte "devspec2array" dafür benutzen um mir alle Geräte mit dem TYPE=TelegramBot ins Array zu laden, um zu schauen, ob das benötigte Device in der Definition schon vorhanden ist.
In meiner Testumgebung ist ein Gerät des Types "TelegramBot" vorhanden, ein
list TYPE=TelegramBot
gibt mir auch genau dieses Device aus.

Nach der ersten "foreach" Schleife habe ich in $i eine "1" stehen und $devicename ist gleich leer.
Aufgrund der "1" dachte ich, dass er mindestens 1x in der foreach Schleife war und somit auch einen $devicename haben müsste.

Daraufhin habe ich das Device welches TYPE=TelegramBot hat wieder gelöscht, jetzt habe ich in $i eine "0" erwartet, weil kein Gerät mehr vorhanden ist.
Ich kriege weiterhin in $i eine "1" geliefert.

Hier ein Teil meines Codes.


package main;

use strict;
use warnings;
use POSIX;

use utf8;

use Encode;

sub
checkPVG_Initialize($)
{
my ($hash) = @_;
# ....
    $hash->{DefFn}    = "checkPVG_Define";
}

# ---------------------------------------------------------------------------------- #
# Erzeugt das notify, für checkMessages                                              #
# ---------------------------------------------------------------------------------- #

sub checkPVG_Define()
{
    my @arraydevice = '';
    my $devicename  = '';
    my $i           = 0;

    # Ermittel alle Devices, die als TYPE = TelegramBot haben
    foreach $devicename (devspec2array("TYPE=TelegramBot"))
    {    @arraydevice[$i] = $devicename;
    }

    # Anzahl der Elemente im Array
    $i = scalar(@arraydevice);

    # Wenn mehr als 1 Element im Array ist, sind mehrere TelegramBot Devices vorhanden -> Ermittlung des Namens kann nicht erfolgen -> Fehlermeldung
    if ($i > 1)
    { Log 3, "checkPVG - Fehlermeldung, es wurden mehr als ein TelegramBot Device gefunden, bitte definiere das richtige manuell!";
return;
    }
elsif ($i == 1)
{ fhem("defmod getMessageTelegram notify " .$arraydevice[0] .":msgId:.* { checkPVG_checkMessage(\"$arraydevice[0]\")")
#fhem("attr getMessageTelegram room Telegram")
Log 1, "checkPVG - Informationsmeldung, dass notify wurde erfolgreich angelegt.";
return;
}

}


Irgendwas muss ich falsch machen, ich weiß leider nicht, wo ich weitersuchen soll.

Gruß
Mathze

CoolTux


foreach $devicename (devspec2array("TYPE=TelegramBot"))
    {    @arraydevice[$i] = $devicename;
    }



foreach (devspec2array("TYPE=TelegramBot")) {
         $devicename = $_
   }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

t1me2die

Moin CoolTux,
ich stehe leider immer noch etwas auf dem Schlauch.
Wie kann ich in die Variable $devicename ein Array reinschreiben?

Wenn ich es nicht ganz falsch verstanden habe, liefert mir "devspec2array" eine Liste mit Anzahl "n" zurück.
Mit der foreach Schleife lese ich nun Element für Element und schreibe es in ein Array (@arraydevice[n]) um mir zum Ende die Anzahl aller Elemente per scalar Funktion ausgeben zu lassen.

Bei deinem Beispiel schreibst du aber alle Elemente die von devspec2array geliefert werden in die Variable $devicename.
Dementsprechend steht in $devicename doch immer das letzte Element aus devspec2array und nicht alle Elemente?

Sorry, ich verstehe das leider noch nicht.

So könnte ich es mir richtig vorstellen?

    foreach (devspec2array("TYPE=TelegramBot"))
    {    @arraydevice[$i] = $_;
    }


Gruß
Mathze

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

devspec2array liefert doch direkt ein Array:
my @arraydevice = devspec2array("TYPE=TelegramBot");Dann prüfen, ob (@arraydevice) => wenn nein: kein Bot => Fehlermeldungwenn >1 => manuelle Angabe erforderlich.
Grundsätzlich würde ich noch anregen, das notify intern zu verwalten und das nicht extern zu definieren (Startpunkt für weitere Infos: https://wiki.fhem.de/wiki/DevelopmentModuleAPI#notifyRegexpChanged).

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

t1me2die

Zitat von: Beta-User am 18 September 2018, 08:16:46
devspec2array liefert doch direkt ein Array:
my @arraydevice = devspec2array("TYPE=TelegramBot");
...

Danke für deine zwei, drei Worte.
Mir war nicht bewusst, dass devspec2array mir direkt ein Array liefert.
Ich dachte, es liefert mir eine Liste, welche ich "Zeile" für "Zeile" in einer Schleife durchgehen muss.
Wieder etwas gelernt, danke.

Werde ich direkt heute Abend ausprobieren, danke.

Gruß
Mathze

CoolTux

Zitat von: t1me2die am 18 September 2018, 08:23:30
Danke für deine zwei, drei Worte.
Mir war nicht bewusst, dass devspec2array mir direkt ein Array liefert.
Ich dachte, es liefert mir eine Liste, welche ich "Zeile" für "Zeile" in einer Schleife durchgehen muss.
Wieder etwas gelernt, danke.

Werde ich direkt heute Abend ausprobieren, danke.

Gruß
Mathze

Sorry das habe ich überlesen. Habe nicht gelesen das Du der Annahme warst das devspec2array eiine Liste liefert. Heißt ja schließlich 2array
Danke beta-user
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net