Hauptmenü

Rückgabewert ECMD

Begonnen von NeuFehm, 19 Dezember 2014, 21:01:34

Vorheriges Thema - Nächstes Thema

NeuFehm

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 :(
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

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
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Puschel74

Hallo,

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

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

tpm88

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

Test FHEM Server on RPi, CUL_HM
Prod FHEM Server on Odroid HC1, HM-USB, JeeLink
Devices: diverse HM, IT1500, 1wire, LaCrosse, MQTT

NeuFehm

:)
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?
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Franz Tenbrock

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
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

NeuFehm

#7
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?
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

NeuFehm

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!!!


Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

betateilchen

Perl Doku lesen...

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

$_ = '!T$a;G;\000;\000;\000;\r\n'
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

NeuFehm

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?
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Puschel74

Hallo,

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

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

NeuFehm

Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

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!
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul