Ich weiß nicht weiter :(
manche reden von "DevIO" und dass das ECMD nun sowas nutzt, aber ich habe keine Ahnung wo ich das finde, was es damit auf sich hat.
Ich habe das Gefühl, dass es keinen Weg gibt eine RS485 anzubinden und RS485 geräte zuverlässig abzufragen.
Bei mir hat das alles mal über ein ECMD funktioniert und dann kam ein Update und nichts geht mehr :(
Hab echt die Nase von FHEM voll. Keine ordentliche Dokumentation, alles nur Varianten wie man "bekannte" Geräte so einbinden kann,
dass man 3€50 sparen kann.
Bin erschöpft :(
Nagut, ich versuche mal ne einfache Frage.....
Wie kann man am ECDM einstellen, dass er erst 1s nach absenden eines Befehls die Schnittstelle öffnet und die Werte "empfäng`"t
Also so schlecht finde ich die Dokumentation in der commandref jetzt nicht, da sind sogar Beispiele aufgeführt, die Deine Frage mit dem Warten beantworten.
Hallo,
bitte den Betreff sinnvoll anpassen.
"Macht keinen Spaß"-Beiträge gehören eigentlich nach Off-Topic.
Grüße
Zitat von: NeuFehm am 19 Dezember 2014, 21:01:34
Hab echt die Nase von FHEM voll. Keine ordentliche Dokumentation, alles nur Varianten wie man "bekannte" Geräte so einbinden kann,
dass man 3€50 sparen kann.
Dringender Rat: Sofort FHEM abschalten und deinstallieren und zu einem proprietären, kommerziellen Hausautomationssystem wechsen!
Wenn dann irgendetwas nicht geht, einfach beim Hersteller-Support ein Ticket mit Subject "Zum Kotzen" öffnen und sofort wird alles gut. Dabei sparst Du auch sicher keine 3,50 EUR....
Kopfschüttel
Tobi
:)
Naja sowas muss auch mal sein.
Vlt kann mir ja wirklich jemand helfen und es liegt einfach nur an meiner Dummheit.
Also: Ich habe einen rs485-Bus und habe daran den digitus USB/485-Adapter.
Ich kann an die Relais (auch Busteilnehmer) über den "set"-Befehl meiner Classdef
ein "alles an" schicken. Das funktioniert wunderbar.
Nun will ich mein Thermometer einbinden.
Das mache ich über "ECMD"
-----------------------------
fhem.cfg:
define mytermo ECMD serial /dev/ttyUSB0@9600
attr mytermo classdefs mytermodev=/opt/fhem/temp.classdef
define WZ_Temp ECMDDevice mytermodev
attr WZ_Temp IODev mytermo
attr WZ_Temp room Garten
define 1Wire_Temp at +*00:15 set WZ_Temp temp
define Log_Temperatur FileLog /opt/fhem/log/Temperatur-%Y.log WZ_Temp:(temp).*
define SVG_Log_Temperatur_1 SVG Log_Temperatur:SVG_Log_Temperatur_1:CURRENT
attr SVG_Log_Temperatur_1 room Garten
-------------------------
meine classdef:
set temp cmd {chr(35).chr(84).chr(36).chr(97).chr(13).chr(10)}
set temp postproc {$_}
-----------------------
Leider braucht das Thermometer ca. 0.8 Sekunden um die Temperatur zu senden.
Da hat aber das ECMDDevice noch nichts empfangen, so dass $_ leer ist.
Wie kann ich das Device/Schnittstelle dazu bewegen, etwas auf die Antwort zu warten?
Vlt. kann mir jemand hier einen entscheidenden Tipp geben?
füll doch erst mal dein Profil aus damit man sieht was du eigentlich an hardeware hast. dann fallen Antworten sicher auch leichter.
Auf welchem Rechner läuft das System, was für Bauteile etc
nur mal so als Tip am Rande
auch ich stand mehr als einmal am Rande des Wahnsinns.
Aber trotz allem ist FHEM einfach genial
So, Profil ausgefüllt ;)
eine Neuigkeit noch. Habe durch LESEN der commandref ;) herausgefunden, dass es auch noch einen Loglevel gibt.
attr mytermo logTraffic 3
eingebaut und siehe da:
2014.12.20 15:48:07 3: mytermo: read "!T"
2014.12.20 15:48:07 3: mytermo: read "$a;G;\000;\000"
2014.12.20 15:48:07 3: mytermo: read ";\000;\r\n"
oder etwas später:
2014.12.20 16:11:47 3: mytermo: read "!T$"
2014.12.20 16:11:47 3: mytermo: read "a;H;\000;\000;\000;\r\n"
d.h. das Device empfängt grundsätzlich schon mal was.
Allerdings kommt mir das "zerstückelt" vor (normalerweise sollte die Antwort in einer Zeile kommen)
Wie kann ich nun diese Antwort per PERL verwerten. Also wenn die komlette Anwort "!T$a;H;\000;\000;\000;\r\n" in $_ wäre, würde ich klar kommen
Hat jemand eine Idee?
Ich würd in dem Fall, dass die Antworte erst ~1 sek. später kommt, auf
reading <reading> match "<regex>"
reading <reading> postproc { <perl special> }
setzen.
Oder aber ein sinnvolles
get <commandname> expect "<regex>"
in Zusammenspiel mit einem attr partial 2
(Das steht alles in der commandref, die du ja gelesen hast)
lg, Ici
Danke, dem gehe ich gleich mal nach.
Übrigens habe ich mal folgende Zeile eingefügt:
$_ = "!T$a;G;\000;\000;\000;\r\n" um erst einmal sicher zu gehen, dass das Scipt funktioniert.
FEHLER: PERL WARNING: Use of uninitialized value $a in concatenation (.) or string at (eval 58) line 1.
Dann habe ich mal geändert:
$_ = "!Txa;G;\000;\000;\000;\r\n" also den $ mit x ersetzt.
TREFFER: Das script berechnet die dazugehörige Temperatur.
Das heißt, ich habe nun noch 2 Fehler zu beseitigen:
1. Das oben beschriebene "attr mytermo partial 2" einbauen und testen... und
neu hinzu:
2. Der Rückgabewert enthält ein $, der aber dann zu einer Fehlinterpredation führt.
Wie kann ich den Rückgabewert "escapen", so dass er nicht zu Fehlern führt.
Danke schon mal bisher!!!
Perl Doku lesen...
Und danach, wenn Du die Doku verstanden hast, einfache Hochkomma statt doppelte verwenden.
$_ = '!T$a;G;\000;\000;\000;\r\n'
oh peinlich ;)
also mein log sieht nun gut aus:
2014.12.20 21:58:21 3: mytermo: write "#T$a\r\n"
2014.12.20 21:58:21 3: mytermo: read "!T$a;\000;\000;\000;\000;\r\n"
nur meine "einfache" classdef gibt den Wert nicht zurück
weder die Verion:
set temp cmd {chr(35).chr(84).chr(36).chr(97).chr(13).chr(10)}
set temp postproc {$_=[ord(substr($_,5,1))]}
noch die:
set temp cmd {chr(35).chr(84).chr(36).chr(97).chr(13).chr(10)}
set temp postproc {$_}
sieht jemand gleich das Problem?
Hallo,
wäre es dir dann mal möglich den Betreff zu überarbeiten?
Danke.
Grüße
Betreff angepasst ;)
HURRA!!!
Eintrag in der fhem.cfg (entscheidend war attr mytermo partial 2 )
------------------------------------
define mytermo ECMD serial /dev/ttyUSB0@9600
attr mytermo classdefs mytermodev=/opt/fhem/temp.classdef
attr mytermo partial 2
define WZ_Temp ECMDDevice mytermodev
attr WZ_Temp IODev mytermo
attr WZ_Temp room Garten
define 1Wire_Temp at +*00:15 set WZ_Temp temp
define Log_Temperatur FileLog /opt/fhem/log/Temperatur-%Y.log WZ_Temp:(temp).*
define SVG_Log_Temperatur_1 SVG Log_Temperatur:SVG_Log_Temperatur_1:CURRENT
attr SVG_Log_Temperatur_1 room Garten
hier meine classdef (entscheidend hier: [set temp expect "!T*\n"]):
---------------------------
set temp cmd {chr(35).chr(84).chr(36).chr(97).chr(13).chr(10)}
set temp expect "!T*\n"
set temp postproc {\
my $datei = 'tempwerte.cfg';;\
open my $tempwerte, '<', $datei or die '$datei: $!';;\
push my @temps, <$tempwerte>;;\
close $tempwerte or die '$datei: $!';;\
$_= $temps[ord(substr($_,5,1))];;\
}
die externe tempwerte enthält eine Liste der Temperaturen, da das Thermometer einen Wert zwischen 0 und 255 zurückgibt.
DANKE an alle die geholfen haben!