# these are the numbers of the buttons as hex chars from 0 to f; params btnup btnstop btndown # setter definitions for opening, stopping and closing the shutters set up cmd {"io set ddr 2 ff\nio set port 2 1%btnup\nwait 1000\nio set port 2 00"} set stop cmd {"io set ddr 2 ff\nio set port 2 1%btnstop\nwait 1000\nio set port 2 00"} set down cmd {"io set ddr 2 ff\nio set port 2 1%btndown\nwait 1000\nio set port 2 00"}Die Definition in der Konfigurationsdatei von fhem lautet wie folgt:
define AVRNETIO ECMD telnet 192.168.xxx.xxx.:2701 set AVRNETIO classdef VeluxRC /path/to/VeluxRC.classdef define 3.kiz.roll ECMDDevice VeluxRC 1 0 2 Um die Rolladen dann abhängig vom Sonnenstand und Wochentag zu öffnen und zu schließen, werden diese Kommandos verwendet:
define at.sunrise.3.kiz.roll.wd at *{sunrise(1800,"06:20")} { fhem("set 3.kiz.roll up") if(!$we) } define at.sunrise.3.kiz.roll.we at *{sunrise(1800,"08:00")} { fhem("set 3.kiz.roll up") if($we) } define at.sunset.3.kiz.roll.1 at *{sunset(-1800,"00:00","19:30:00")} set 3.kiz.roll down
Am 23.01.2011 15:41, schrieb Willi:
> das ist ja toll!
freut mich, daß die Module für Dich nützlich sind.
> Würdest Du Deine Beispiele zur Verfügung stellen? Im CVS habe ich
> nichts gefunden (evtl. habe ich aber auch falsch gesucht).
Die beispielhaften Klassendefinition für ADC und I/O-Ports sind ja in
der Dokumentation zum ECMDDevice bei den Beispielen. Wenn Du mir sagst,
was Du genau brauchst, kann ich eine Klassendefinition dafür schreiben.
> - Können mit diesem Modul auch automatisch Eingabeports von avr-net-io
> abgefragt und ins Filelog geschrieben werden?
In der Tat wird derzeit noch nichts protokolliert. Es wäre zu ergänzen,
daß nach einem set oder get etwas ins Log geschrieben wird. Dazu müßten
die Kommandos (value, up, down, ...) zugleich als Readings interpretiert
werden.
Was meinst Du mit "automatisch abfragen"?
Viele Grüße,
Boris
Am 23.01.2011 21:13, schrieb Willi:
> Mir fällt dazu spontan folgendes für 67_CMDDevice.pm ein:
>
> get <name> <commandname>
>
> generiert READINGS wie folgt:
>
> $def->{READINGS}{$commandname}{VAL} = $result_of_ecmd;
das ist implementiert und im CVS eingecheckt. Es sind nur rudimentäre
Tests erfolgt, ich würde mich freuen, wenn Du es testest und eine
Rückmeldung gibst.
>> Was meinst Du mit "automatisch abfragen"?
> Ich meinte damit eigentlich, dass das Modul avr-net-io pollt (z.B.
> alle 5 Minuten), dabei die Ports von avr-net-io abfragt und die
> Ergebnisse als Reading schreibt, damit man das auch als Filelog hat.
Ich habe die beiden Module im Vorgriff auf fhem 6 nach den neuen
Development Guidelines entwickelt, soweit abwärtskompatibel. Leider
fehlt für fhem 6 noch das Konzept für die Polling-Infrastruktur. Ich
schlage daher vor, daß Du ein at-Kommando benutzt, um periodisch ein get
zu machen. Dabei wird jedesmal das Reading gesetzt und ein Notify und
Filelog-Eintrag getriggert.
Viele Grüße,
Boris
ich habe 66_EMCD um die serielle Schnittstelle erweitert. Die Doku ist
(noch) _nicht_ aktualisiert. Du mußt
define myGenericSerialDevice ECMD serial /dev/ttyS0
oder ähnliches definieren. In der Klassendefinition ledticker.classdef
würde ich so etwas wie
set text cmd { "STEUERCODES%tickertext" }
set text params tickertext
schreiben und ein logisches Gerät
define myLedticker ECMDDevice ledticker.classdef
definieren. Mit
set myLedticker text 'Hallo, ich bin der Tickertext'
sollte das dann klappen. Das alles inklusive der seriellen Kommunikation
ist völlig ungetestet: der Kode ist bei mir mangels Zeit und Gerät nie
gelaufen.
Viel Glück!
Boris
Dank des Super-Frameworks von Rudi war die Erweiterung ruckzuck
umgesetzt. fhem.pl habe ich angefasst, weil ich ein paar
Convenience-Funktionen brauchte und daher bestehende Programmteile
ausgekoppelt habe, um Kode-Doppelungen zu vermeiden.
Viele Gruesse,
Boris
Am 04.02.2011 07:46, schrieb appi:
> 2011.02.04 07:36:00 3: ECMD opening myGenericSerialDevice (protocol
> serial, device /dev/ttyUSB0@9600)
> 2011.02.04 07:36:00 3: CUL setting myGenericSerialDevice baudrate to
> 9600
> 2011.02.04 07:36:00 3: ECMD device opened
> 2011.02.04 07:36:03 1: myGenericSerialDevice: Timeout reading answer
> for get version
> 2011.02.04 07:36:03 1: Cannot init myGenericSerialDevice (/dev/
> ttyUSB0), ignoring it
> 2011.02.04 07:36:03 1: myGenericSerialDevice: Timeout reading answer
> for get version
ich habe es soeben ausprobiert und bei mir geht es.
fhem.conf:
define physicalCUL ECMD serial /dev/ttyACM0
set physicalCUL classdef CUL ...../CUL.classdef
define logicalCUL ECMDDevice CUL
CUL.classdef:
get version cmd {"V"}
fhem starten, dann auf der telnet-Konsole:
get logicalCUL version
version: V 1.37 CUL868
get physicalCUL raw V
physicalCUL raw => V 1.37 CUL868
Bist Du sicher, daß der CUL das Gerät /dev/ttyUSB0 erzeugt? Bitte mit
dmesg nach dem Anstecken des CUL prüfen.
Viele Grüße,
Boris
Funktioniert bei mir, es mögen bitte auch die anderen Verwender testen.
Grüße,
Boris
Am 05.02.2011 07:32, schrieb appi:
> ich will eine RS323 Schnittstelle ( Lauflicht oder Somfy 16RTS ) mit
> deinem Modul ansteuern. Das ist kein CUL im einsatz,
> sondern nur ein USB-RS232 Wandler ( pl2303 ) dieser pl2303 kann die
> Verionsfrage nicht beantworten und deshalb kriege ich dein Modul nicht
> connectet.
>
kannst Du bitte eine minimale fhem.conf und Somfy.classdef fuer Zwecke
erstellen und diese hier posten?
Gruesse,
Boris
Am 07.02.2011 07:11, schrieb appi:
> die befehle sind eigentilch ganz einfach für somfy 16RTS:
> "0105U " 16RTS gerät 01, Kanal 05, U für Rollladen Up
> "0105D" 16RTS gerät 01, Kanal 05, D für Rollladen Down
> "0103S" 16RTS gerät 01, Kanal 03, S für Rollladen Stop
>
> mit dem linux Command Befehl : Echo "0105U" > ttyUSB0 funktioniert
> die Rolladensteuerung auch gut, aber ich hätte gerne
> im FHEM und nicht auf Linuxebene.
>
>
meiner Meinung nach muesste das so aussehen (ungetestet, aus dem Kopf):
define mySerialDevice ECMD serial /dev/ttyUSB0
set mySerialDevice classdef Somfy /path/to/Somfy.classdef
(oder attr mySerialDevice classdefs Somfy=/path/to/Somfy.classdef)
mit Somfy.classdef wie folgt:
set up cmd { "0105U" }
set down cmd { "0105D" }
set stop cmd { "0103S" }
Wenn das laeuft kannst Du nach und nach den Parameter 01 und den Kanal
(warum eigentlich 03 und 05?) durch Parameterdefinitionen ersetzen.
Viel Erfolg!
Boris
Am 10.02.2011 16:41, schrieb appi:
> leider funktionier es noch nicht richtig, das beim öffnen des Devises
> ECMD die Version ausgelesen werden sollte,
das Auslesen der Version war für Ethersex gedacht und ich hatte
vergessen, es zu entfernen, nachdem ich auf die Idee gekommen bin, daß
ECMD universell einsetzbar ist. Bitte 66_ECMD.pm aktuell aus dem CVS
abrufen!
Bitte in Deiner Konfig noch eine Zeile ergänzen:
> die config:
> attr global logfile /var/log/fhem/fhem-%Y-%m.log
> attr global modpath /usr/share/fhem
> attr global port 7072 global
> attr global statefile /var/log/fhem/fhem.save
> attr global verbose 3
> define CUL433 CUL /dev/ttyACM0@9600 1231
>
> define mySerialDevice ECMD serial /dev/ttyUSB0
> set mySerialDevice classdef Somfy /usr/share/fhem/Somfy.classdef
define mySomfy ECMDDevice Somfy
>
> define WEB FHEMWEB 8083 global
>
> define WEBS FHEMWEB 8084 global
> attr WEBS smallscreen
>
> # Fake logfile, to access the global log
> define Logfile FileLog /var/log/fhem/fhem-%Y-%m.log fakelog
und dann sollte
set mySomfy down
funktionieren.
Viele Grüße,
Boris
Am 30.03.2011 17:27, schrieb Mark:
> Missing REQUIRED setting for STOP at ./FHEM/66_ECMD.pm line 227
der serielle Teil ist von mir mangels Möglichkeit nicht getestet wurden.
Es sieht mir so aus, als ob die schließende Klammer von Zeile 225 hinter
Zeile 203 könnte. Bitte ausprobieren oder alternativ die Baudrate beim
define des Device angeben (siehe Doku).
> 3. Wie bekomme ich eine Pause in die Zeichenfolge?
Gar nicht. Was immer Du tust, der String wird in einem Rutsch an das
Device gesendet. Wenn Du es unbedingt brauchst, mußt Du ECMD so
modifizieren, daß ein bestimmtes ASCII-Zeichen beim Senden in
ECMD_SimpleWrite als Pause interpretiert wird.
Viele Grüße,
Boris
Am 30.03.2011 22:13, schrieb Mark:
> okay aus dem COM1 habe ich ein COM1@9600 gemacht
>
> Ergebnis:
> C:\fhem-5.0>fhem com.cfg
>
> Keine Meldung, fhem hängt - Kein Telnet (verbinden geht aber keine
> Reaktion auf Eingaben) kein PGM2
>
> 2011.03.30 21:46:08 3: ECMD device opened
bisher sieht das gut aus!
> fhem hängt - Kein Telnet (verbinden geht aber keine Reaktion auf
> Eingaben) kein PGM2
Das ist merkwürdig. Hast Du fhem schon mal ohne den ECMD-Teil am laufen
gehabt? Bitte wie folgt testen:
1. Minimalkonfiguration
2. wie 1 plus Anlage des ECMD-Geräts
3. wie 2 plus Anlage des ECMDDevice-Geräts
Grüße,
Boris
Ich vermute ein Problem mit Zeile 370 in 66_ECMD.pm:
last if($err && $err =~ m/^Timeout/);
Bitte füge davor folgende Zeile ein:
Log 1, "DEBUG: " . $err;
Dann zeige uns bitte das Protokoll.
Grüße,
Boris
OK, ich weiß, was fhem zum Hängen bringt. Es liegt daran, daß der
Filedescriptor unter Windows verschwindet. Der entsprechende Kode, den
ich aus dem CUL-Kode herauskopiert hat, deutet daraufhin, daß dem
ursprünglichen Autor das Problem bekannt ist. Ich werde in den nächsten
Tagen eine aktualisierte Version einchecken, um den Hänger zu
beseitigen. Der Sache mit dem "Device lost" muß separat betrachtet werden.
Grüße,
Boris
Für die nächsten Versuche bitte
attr global verbose 5
setzen.
Grüße,
Boris
Am 02.04.2011 10:47, schrieb Mark:
> Ein get in die classdef eingefügt
> get value cmd {" "}
> get value params
Die zweite Zeile ist überflüssig. Bitte weglassen.
> das liefert leider keine Ergebnisse.
In Zeile 596 von 66_ECMD.pm ist ein Tippfehler. Entweder neue
CVS-Version abrufen oder aus "'ecmd" ein "$ecmd" machen. Danach wieder
mit Level 5 debuggen und die Ausschnitte aus dem Log nach den set- und
get-Kommandos zeigen.
> Vielleicht kann man auch gleich die Antwort der Steuerung
> verwenden.
Die sollte als Reading "value" bzw. auch schon bei "on" und "off"
stehen. Bei mir sieht das beispielsweise so aus:
list 3.dz.roll1
Internals:
DEF VeluxRC 3 4 5
IODev AVRNETIO
NAME 3.dz.roll1
NR 9
STATE up: OK;OK;OK;OK
TYPE ECMDDevice
Readings:
2011-04-01 08:28:26 stop OK;OK;OK;OK
2011-04-02 08:00:02 up OK;OK;OK;OK
Down:
TIME 2011-03-30 12:06:27
VAL
Fhem:
classname VeluxRC
Params:
btndown 5
btnstop 4
btnup 3
Attributes:
room 3-DG
Viele Grüße,
Boris
Am 02.04.2011 22:45, schrieb Mark:
> Use of uninitialized value $r[0] in join or string at ./FHEM/
> 66_ECMD.pm line 600
deutet daraufhin, daß ECMD_ReadAnswer keine Antwort liefert.
> fhem-min.log:
> 2011.04.02 22:39:30 5: Cmd: >get myHZCOM1 value<
> 2011.04.02 22:39:30 5: ECMDDevice: Analyze command >{" "}<
> 2011.04.02 22:39:30 5: mySerialDevice sending
> 2011.04.02 22:39:30 5:
Was man in der vorstehenden Zeile auch sieht.
Du mußt ab jetzt selbst debuggen. Die Kommunikation läuft in der Routine
ECMD_Write (66_ECMD.pm, Zeilen 586 bis 601) ab. In Zeile 595 wird das
Kommando (ein Space) an die serielle Schnittstelle geschickt und in
Zeile 596 wird die Antwort ausgelesen. Bau mal ein paar
Debugging-Outputs in der Form Log 1, "DEBUG: ich sende " . $ecmd; usw.
ein. Vielleicht mußt Du auch in ECMD_SimpleWrite und _SimpleRead
reinschauen.
Viele Grüße,
Boris
Am 03.04.2011 20:00, schrieb Mark:
>> Du mußt ab jetzt selbst debuggen.
> Was in meiner Macht liegt habe ich gemacht.
Danke für Deine Rückmeldung.
Anpassungen bei dem Modul möchte ich nicht machen, da ich die von Dir
eingesetzte Kombination (Windows + seriellen Port) nicht testen kann.
Den Code habe ich "blind" aus dem CUL-Modul übernommen. Der
Schreiben-Teil funktioniert ja, der Lesen-Teil aber bei Dir nicht.
Ich schlage vor, daß Du einen neuen Thread aufmachst zu dem spezifischen
Problem, daß Dich plagt. Vielleicht gibt es einen anderen Anwender von
EMCD unter Windows auf seriellem Port, der Dir weiterhelfen kann, oder
einen anderen fhem-Entwickler, der sich mit seriellem Port unter Windows
auskennt.
Sorry.
Boris
Pollin hat so was, z.B.
http://www.pollin.de/shop/dt/NTU5OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_Relaiskarte_K1.html
AVRNETIO und das Teil koenntest Du aus derselben Spanungsquelle betreiben.
Gruesse,
Boris