Hallo zusammen,
ich bin noch ziemlich neu in der Modulentwicklung, genau genommen stecke ich gerade in den Kinderschuhen und gehen nach dem Prinzip Learning-by-Doing vor.
Grobe Zielsetzung des Moduls: Mithilfe eines zweistufigen Konzepts sollen eine selbstentwickelte Arduino-Basisstation und verschiedene über Funkt angebundene Arduinos gesteuert werden. Einsatzzweck der Arduinos sind Sachen wie Pumpensteuerung am Pool und UV-Lampensteuerung, Überwachung der Wassertemperatur und später noch weitere Erweiterung. Die Arduinos werden hierbei selbst programmiert. Rudimentär funktionierende Prototypen sind vorhanden, sodass ich mich nun erstmal an das FHEM Modul begeben wollte. Der Basisarduino wird später über USB am FHEM-Server (Raspberry) angeschlossen und über die serielle Schnittstelle Daten empfangen/senden.
Aktueller Stand: Mit Hilfe der Dokumentation im FHEM Wiki habe ich ein physisches Modul geschrieben. Ich nenne es "Multiduino". Nun wollte ich dieses schon mal auf Funktion testen. Nachdem ich einige Tippfehler korrigieren konnte, hänge ich nun fest und das Modul wird nicht geladen.
Der Quellcode meines Moduls ist wie folgt:
sub Multiduino_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "Multiduino_Define";
$hash->{UndefFn} = "Multiduino_Undef";
$hash->{SetFn} = "Multiduino_Set";
$hash->{GetFn} = "Multiduino_Get";
$hash->{AttrFn} = "Multiduino_Attr";
$hash->{ReadFn} = "Multiduino_Read";
$hash->{ReadyFn} = "Multiduino_Ready";
$hash->{ShutdownFn} = "Multiduino_Shutdown";
#Hier werden die unterstuetzten Attribute festgelegt
$hash->{AttrList} =
"test:ja,nein" .
$readingFnAttributes; #Funktion evtl. unnötig, genaueres später klären
$hash->{Clients} = "Multiduino_Switch";
#ACHTUNG! hier noch Matchausdrücke einbauen
$hash->{MatchList} = { ""
};
}
sub Multiduino_DeviceInit()
{
#zum Testen leere Funktion eingefügt
}
sub Multiduino_Define($$)
{
my ( $hash, $def ) = @_;
my @a = split( "[ \t][ \t]*", $def ); # Definition wird durch Leerzeichen getrennt in einzelne Zeichenketten zerlegt
my $name = $a[0];
my $module = $a[1];
my $dev = $a[2];
#Fehlerbehandlung, falls define Befehl falsch eingegeben
if(int(@a) != 3) {
return "zu wenig Parameter, korrekte Syntax ist: define [name] modul [url]";
}
#Werte als internals im Hash speichern, damit diese auch anderen Funktionen zur Verfuegung stehen
$hash->{dev} = $dev;
#USB Verbindung zum Geraet herstellen
my $ret = DevIo_OpenDev( $hash, 0, "Multiduino_DeviceInit" );
return $ret;
}
sub Multiduino_Undef($$)
{
my ($hash, $name) = @_;
DevIo_CloseDev($hash);
return undef
}
sub Multiduino_Delete($$)
{
my ( $hash, $name ) = @_;
# Löschen von Geräte-assoziiertem Temp-File
#unlink($attr{global}{modpath}."/FHEM/FhemUtils/$name.tmp";)
return undef;
}
sub Multiduino_Read($)
{
my ($hash) = @_;
my $name = $hash->{NAME};
#einlesen der bereitstehenden Daten
my $buf = DevIo_SimpleRead($hash);
return "" if (!defined($buf));
Log3 $name, 5, "Multiduino ($name) - received data: ".$buf;
my $buf2 = $hash->{PARTIAL};
$buf2 .= $buf;
while($buf2 =~ m/\n/) {
my $rmsg;
($rmsg, $buf2) = split("\n", $buf2, 2);
my $found = Dispatch($hash, $rmsg, undef);
$hash->{PARTIAL} = $buf2;
$buf2 = $hash->{PARTIAL};
}
$hash->{PARTIAL} = $buf2;
}
sub Multiduino_Ready($)
{
my ($hash) = @_;
# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.
return DevIo_OpenDev($hash, 1, undef ) if ( $hash->{STATE} eq "disconnected" );
# This is relevant for Windows/USB only
if(defined($hash->{USBDev})) {
my $po = $hash->{USBDev};
my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;
return ( $InBytes > 0 );
}
}
sub Multiduino_Shutdown($)
{
my ($hash) = @_;
# Verbindung schließen
DevIo_CloseDev($hash);
return undef;
}
und der FHEM gibt folgendes Logfile aus:
2016.12.29 22:08:45 0: Server shutdown
2016.12.29 22:08:49 1: Including fhem.cfg
2016.12.29 22:08:49 3: telnetPort: port 7072 opened
2016.12.29 22:08:51 3: WEB: port 8083 opened
2016.12.29 22:08:51 3: WEBphone: port 8084 opened
2016.12.29 22:08:51 3: WEBtablet: port 8085 opened
2016.12.29 22:08:51 2: eventTypes: loaded 0 events from ./log/eventTypes.txt
2016.12.29 22:08:51 1: Including ./log/fhem.save
2016.12.29 22:08:51 1: usb create starting
2016.12.29 22:08:53 3: Probing CUL device /dev/ttyAMA0
2016.12.29 22:08:53 3: Can't open /dev/ttyAMA0: Permission denied
2016.12.29 22:08:54 1: usb create end
2016.12.29 22:08:54 2: SecurityCheck: WEB,WEBphone,WEBtablet has no associated allowed device with basicAuth. telnetPort has no associated allowed device with password/globalpassword. Restart FHEM for a new check if the problem is fixed, or set the global attribute motd to none to supress this message.
2016.12.29 22:08:54 0: Featurelevel: 5.7
2016.12.29 22:08:54 0: Server started with 9 defined entities (fhem.pl:12423/2016-10-24 perl:5.020002 os:linux user:fhem pid:689)
2016.12.29 22:09:02 1: reload: Error:Modul 30_Multiduino deactivated:
Ich teste auf einer komplett jungfräulichen FHEM installation.
Mein Problem ist hier, dass es keine Fehlermeldung gibt und ich was Perl angeht blutiger Anfänger bin und mir nicht mehr zu helfen weiß.
Wenn jemand von euch eine Idee oder Lösungstipp hätte wäre ich sehr dankbar!
Vielen Dank und viele Grüße
Karl
Hi,
es fehlt die "1;" am Ende des Sourcecodes.
Allerdings: Das sieht für mich danach aus, als ob Du mySensors neu erfindest. Warum?
Gruß,
Thorsten
Hi Thorsten,
danke! Das war es, jetzt lädt es.
Ehm, ich hatte mir mySensors nur mal flüchtig angesehen und ist schon eine Weile her. Hauptgrund ist bei mir die Möglichkeit eines Schalters mit Rückmeldung, denn die UV-Lampen sollen nur eingeschaltet werden können, wenn die Pumpen laufen. Als Schutz vor Überhitzung. Den Schalter hatte ich damals nicht gesehen. Angedacht ist mittelfristig auch eine Steuerung der Solarmatten, welche wir im Sommer als Heizung nutzen bzw. des dazugehörigen Wasserkreislaufs. Da wollte ich das ganze möglichst gut individualisieren können.
Aber danke auch für den mySensors Hinweis, ich schaue mir das nochmal an. Würde auf jeden Fall ziemlich viel Arbeit sparen. Nichtsdestotrotz macht es mir ja auch Spaß, das ganze selbst zu erstellen.
Viele Grüße
Kevin
Vielleicht sollten wir noch einen expliziten Hinweis auf die Notwendigkeit von "1;" im Wiki zur Modulentwicklung hinterlegen. Notier ich mir mal.
Gruß
Markus
Zitat von: karlj am 29 Dezember 2016, 22:39:36Ehm, ich hatte mir mySensors nur mal flüchtig angesehen und ist schon eine Weile her. Hauptgrund ist bei mir die Möglichkeit eines Schalters mit Rückmeldung, denn die UV-Lampen sollen nur eingeschaltet werden können, wenn die Pumpen laufen.
Bei mySensors ist man ja nicht auf die schon bestehenden Programme beschränkt. Es ist recht einfach, aus den Beispielen auf der mySensors-Seite neue Geräte zusammenzustellen. Voraussetzung ist natürlich, dass man sich mit Arduino (oder ähnlich) schon ein bisschen auskennt. Das nehme ich bei Dir aber an, da Du ja schon selbst etwas zusammengebastelt hast.
Zitat
Nichtsdestotrotz macht es mir ja auch Spaß, das ganze selbst zu erstellen.
Das ist natürlich immer ein guter Grund.
Gruß,
Thorsten
Hallo zusammen,
ich habe das ganze nochmal unter https://wiki.fhem.de/wiki/DevelopmentModuleIntro#Grundlegender_Aufbau_eines_Moduls präzisiert (Abschnitt "Inhaltlicher Aufbau").
Verbesserungsvorschläge sind natürlich gerne willkommen.
Viele Grüße
Markus