FHEM Forum

FHEM => Sonstiges => Thema gestartet von: NeuFehm am 19 Dezember 2014, 21:01:34

Titel: Rückgabewert ECMD
Beitrag von: NeuFehm am 19 Dezember 2014, 21:01:34
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 :(
Titel: Antw:Zum Kotzen
Beitrag von: NeuFehm am 19 Dezember 2014, 21:04:17
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
Titel: Antw:Zum Kotzen
Beitrag von: betateilchen am 19 Dezember 2014, 21:20:20
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.
Titel: Antw:Zum Kotzen
Beitrag von: Puschel74 am 20 Dezember 2014, 08:45:27
Hallo,

bitte den Betreff sinnvoll anpassen.
"Macht keinen Spaß"-Beiträge gehören eigentlich nach Off-Topic.

Grüße
Titel: Antw:Zum Kotzen
Beitrag von: tpm88 am 20 Dezember 2014, 12:05:00
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

Titel: Antw:Zum Kotzen
Beitrag von: NeuFehm am 20 Dezember 2014, 15:06:56
:)
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?
Titel: Antw:Zum Kotzen
Beitrag von: Franz Tenbrock am 20 Dezember 2014, 15:13:15
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
Titel: Antw:Zum Kotzen
Beitrag von: NeuFehm am 20 Dezember 2014, 16:07:52
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?
Titel: Antw:Zum Kotzen
Beitrag von: Icinger am 20 Dezember 2014, 16:32:40
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
Titel: Antw:Zum Kotzen
Beitrag von: NeuFehm am 20 Dezember 2014, 21:34:01
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!!!


Titel: Antw:Zum Kotzen
Beitrag von: betateilchen am 20 Dezember 2014, 21:38:10
Perl Doku lesen...

Und danach, wenn Du die Doku verstanden hast, einfache Hochkomma statt doppelte verwenden.

$_ = '!T$a;G;\000;\000;\000;\r\n'
Titel: Antw:Zum Kotzen
Beitrag von: NeuFehm am 20 Dezember 2014, 22:05:59
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?
Titel: Antw:Zum kotzen
Beitrag von: Puschel74 am 21 Dezember 2014, 08:02:16
Hallo,

wäre es dir dann mal möglich den Betreff zu überarbeiten?
Danke.

Grüße
Titel: Antw:Rückgabewert ECMD
Beitrag von: NeuFehm am 21 Dezember 2014, 18:11:00
Betreff angepasst ;)
Titel: Antw:Rückgabewert ECMD
Beitrag von: NeuFehm am 21 Dezember 2014, 22:43:17
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!