Also: Ich versuche mal mein bisheriges Verständnis über FHEM darzustellen, habe aber sehr wenig Ahnung von Perl. Meist kopiere ich, änder ich den Code ab und freue mich, wenns klappt.
Und vorab: Ja, ich hätte lieber eine unterstützte Hardware nehmen sollen, aber irgendwie ist alles anders gekommen ;)
Jetzt will ich mich an ein eigenes Modul wagen.
Das Modul ist eine einfache Lampe, welche über einen seriellen Bus angeschlossen ist.
Hinzu kommt der Raspberry und ein USB2serial (hier RS485).
Ich habe dafür gesorgt, dass Schnittstelle und Rasp miteinander verbunden sind und auch kommunizieren können. Auch habe ich es geschafft den speziellen Lampenbefehl: #T"1AErn per PERL an die serielle Schnittstelle zu senden und siehe da, die Lampe leuchtet. Bis hierher ohne FHEM.
Der Befehl #T"1AErn besteht aus verschienden Funktionen #T" spricht den Typ an, die 1 die Nummer und das Nachfolgende die Funktion, hier "toggle".
Wenn ich nun an Fhem denke, so glaube ich wie folgt:
1. Ich muss die Schnittstelle (/dev/ttyUSB0) als CUL definieren und zum laufen bringen
2. Ich muss ein Modul "MeineLampe" erstellen welches den typischen Befehl set lamp1 on
als solchen versteht und dann den string an ein WriteIO Modul von Fhem sendet, welches wiederum mit Hilfe der definierten Schnittstelle das dann auf die RS485 sendet...
Sind meine Gedanken bis hier her richtig?
Kann jemand meine Gedanken lenken? ;)
LG Mirko
wenn du deine hardware per serieller schnittstelle ansprechen kannst schau dir mal das ECMD modul in fhem an.
gruss
andre
So habe die Rechte gesetzt:
$ sudo usermod -a -G tty pi
$ sudo usermod -a -G tty fhem
und anschließend in der fhem.cfg die Zeile eingefügt:
define MEINECUL CUL /dev/ttyUSB0@9600 1234
Das logfile sagte darauf hin:
2014.07.24 21:05:01 3: Opening MEINECUL device /dev/ttyUSB0
2014.07.24 21:05:01 3: Setting MEINECUL baudrate to 9600
2014.07.24 21:05:01 3: MEINECUL device opened
Das klingt doch schon mal gut oder?
Jetzt weiß ich nicht weiter.
Ich denke ich schau mir mal die besagte Datei an. Gefunden habe ich in /opt/fhem/FHEM die
66_ECMD.pm und die
67_ECMDDevice.pm
Ohje... ich glaube ich verstehe nur Bahnhof.
Habe mir die Dateien mit einem Editor angeschaut und versucht zu verstehen.
In der ---device ist auch HTML-Code drin.
Soll ich das Modul einbinden/starten/???/bearbeiten/kopieren/umbenennen...
Ich brauch eine Richtung/Stichwort.
LG Mirko
schau dir die commandref zu ECMD und ECMD_DEVICE an. das sind die module die du statt CUL verwenden kannst. das CUL modul ist NUR für einen echten cul. nicht für irgend etwas anderes auf einer seriellen schnittstelle.
die commandref findest du auf deiner fhem installation in fhemweb unten links oder hier: http://fhem.de/commandref.html#ECMD (http://fhem.de/commandref.html#ECMD).
wenn du hier im forum nach ECMD suchst wirst du auch einiges finden.
ansonsten muss du dir normalerweise bei den fertigen modulen keinen quelltext ansehen sondern die dokumentation. die wird automatisch aus dem html teil generiert. eben die commandref.
die einsteiger pdf solltest du auch lesen: http://fhem.de/Heimautomatisierung-mit-fhem.pdf (http://fhem.de/Heimautomatisierung-mit-fhem.pdf).
gruss
andre
Hallo Andre,
Danke!
Vlt. ist alles einfacher, als man denkt...
Ich melde mich wieder :)
LG Mirko
ALSO ;)
Ich habe recherchiert und tatsächlich einen Ansatz mit dem ECMD gefunden...
Ich habe in /etc eine fhem.classdef.m-modul erstellt
set on cmd {chr(35).chr(77).chr(35).chr(69).chr(53).chr(53).chr(49).chr(13).chr(10)}
set off cmd {chr(35).chr(77).chr(35).chr(69).chr(53).chr(53).chr(48).chr(13).chr(10)}
dann habe ich in fhem.cfg hinzugefügt:
define MEINECUL ECMD serial /dev/ttyUSB0@38400
define myrelais ECMD serial /dev/ttyUSB0@9600
attr myrelais classdefs myrelais=/etc/fhem.classdef.m-modul
attr myrelais room Garten
ich hoffte mit "set myrelais" on,
dass dann der set on befehl an die serielle Schnittstelle geschickt wird.
Stattdessen kommt:
Unknown argument on, choose one of reopen classdef
Mh.... ich glaube ich irre noch in den fhem-Welten umher ;)
Kann mir wieder jedmand einen Denkanstoss verpassen? ;)
LG Mirko
LG Mirko
dein ECMD device solltest du mit get raw testen können. dann brauchst du noch ein ECMD_DEVICE. damit sendest du dann on und off.
gruss
andre
Ist das geil!!!!
in fhem.cfg:
#Relais definieren
define myrelais ECMD serial /dev/ttyAMA0@9600
attr myrelais classdefs myrelaisdevice=/opt/fhem/relais.classdef
define AlleRelais ECMDDevice myrelaisdevice
attr AlleRelais room Garten
Meine relais.classdef enthält:
set on cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(13).chr(10)}
set off cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}
nun habe ich tatsächlich im Raum "Garten" ein ECMDDevice
mit dem Namen "AlleRelais", einem Lampensymbol und ein off-Link und ein on-Link
Wenn ich auf "on" klicke wird das on cmd an die Schnittstelle geschickt und alle Relais gehen an....
Das Gleich mit off, nur aus...
Wie GEIL ist das denn :)
DANKE an alle Tipps!!!!
PS: Ich habe vorher mit Perl getestet, bei welchem Befehl die Relais schalten.
Hier mein Test-Perl:
use strict;
use warnings;
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyAMA0");
$port->databits(8);
$port->baudrate(9600);
$port->parity("none");
$port->stopbits(1);
$port->handshake("on");
$port->write_settings;
my $zeichen = chr(35).chr(77).chr(35).chr(80).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(13).chr(10);
$port->write($zeichen);
Mein Temperaturfühler liefert einen dezimalwert (0-255)
Ich habe eine Tabelle, wo jeder dezimalwert einer Temperatur zugewiesen ist.
wie binde ich sowas in FHEM ein?
meine classdef:
#Senden der Temperaturabfrage
set temp cmd {chr(35).chr(84).chr(34).chr(97).chr(13).chr(10)}
Aus dem Ergebnis die richtige Stelle lesen und in dezimal umwandeln
set temp postproc {ord(substr($_,5,1))}