externe State-Abfrage - Leerzeichen ?

Begonnen von Klaus0815, 25 Mai 2014, 16:04:07

Vorheriges Thema - Nächstes Thema

Klaus0815

Ich weiss nicht ob es ein Homematic-Thema ist, oder generell FHEM betrifft, ich stelle es mal hier rein.

Ich frage einen Drehgriffkontakt HM-Sec-RHS von einem externen Programm in FHEM ab. z.B. mit

terassentuer=`echo 'list Balkontuer STATE' | nc 127.0.0.1 7072 -q 1 2>/dev/null `

echo "Tuerstatus:  $terassentuer"

if [ "$terassentuer" = "Balkontuer open"  ]

        then


Bisher kam als Antwort z.B. "Balkontuer open"
Als plötzlich diverse Dinge nicht mehr funktionierten, habe ich mich auf die Suche gemacht-
ich bekomme jetzt als Antwort z:B. "Balkontuer          open" mit 11 Leerzeichen dazwischen.

Frage ich direkt im FHEM-Webinterface ab, ist nur ein Leerzeichen drin.

Andere Sensoren haben auch nur ein Leerzeichen

Ich habe das jetzt in meiner Abfrage geändert, kein Problem,
Aber ich bin etwas verunsichert, habe meine diversen Abfragen damals wohl zu schlampig programmiert, muss ich jetzt sicherheitshalber alles umstellen ?

Grüße

Klaus

betateilchen

Wäre es nicht einfacher, den tatsächlichen Wert direkt so abzufragen:



terassentuer=`echo '{ReadingsVal("Balkontuer","state","?")}' | nc 127.0.0.1 7072 -q 1 2>/dev/null `



Dann bekommst Du das Ergebnis völlig unabhängig von der zurückgelieferten Formatierung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

martinp876

hallo Klaus
a) es ist ein allgemeines Thema. Wenn du ein List machst werden offensichtlich spalten eingehalten. Die Blanks sind nicht in HM.
b) wie fragst du direkt im web inteface? List?
c) ein List ist nicht wirklich geeignet solche Daten abzufragen - sehr unsichere programmierung. Willst du den state kannst du mit
{InternalVal("Balkontuer","STATE","")}

Klaus0815


Hallo Martin,

ich weiß nicht, ob es wirklich allgemein ist. das Problem tritt nur, und auch erst seit paar Tagen, beim HM-Sec-RHS auf.
Der HM-Sec-RHS gibt auf
echo 'list Balkontuer STATE' | nc 127.0.0.1 7072 -q 1 2>/dev/null

als Antwort
Balkontuer           closed


Ein Schließerkontakinterface  SCI-3FM gibt auf
echo 'list Gartenhaus_Tuerschloss STATE' | nc 127.0.0.1 7072 -q 1 2>/dev/null

als Antwort
Gartenhaus_Tuerschloss closed


Ich frage auch im Webinterface direkt über list ab.
Dort ist auch bei der Balkontuer keine Lücke, allerdings ist Balkontuer ein Link.
(Es wurde die letzte Zeit nichts umbenannt)

Werde das von Dir vorgeschlagene InternalVal und auch das von Betateilchen vorgeschlagene ReadingsVal  testen.
Habe leider nur rel. wenig zu den beiden Befehlen in der Referenz gefunden

Falls es mir jemand erklären mag:
Warum ist die Abfrage per Readingsval sicherer als mit list?
Was ist der Unterschied zwischen InternalVal und ReadingsVal ?
Da ich momentan sehr viel per list abfrage, was kann passieren ?

Viele Grüße

Klaus

martinp876

Hallo Klaus,

mache einmal ein
list Balkontuer
im webinterface und an der console. Da siehst du, dass es formatiert kommt. HM unterscheidet nicht zwischen den Interfaces. Das ist sicher generell.

Beachte, dass list eigentlich garkeine Option für eine derartige Anfrage ist. Es gibt eine Zeile aus. Nutzes die interfaces, die dafür vorgesehen sind - oder du musst dich durchbeissen.
ein
ReadingVal
InteralVal
gibt dir den Wert eines Readings zurück
list gibt eine Liste zurück - in deinem Fall eine Zeile - aber immer noch keinen "Wert".

mache einmal ein
list .* STATE
als ergebniss siehst du, wie list formatiert.

ZitatIch frage auch im Webinterface direkt über list ab.
da hast du glück...

Reading und InternalVal geben dir von einer Entity den Inhalt der Variable zurück. Sollte diese nicht existieren bekommst du den defaultwert. ReadignVal gibt die Werte aus reading "state" und internalVal aus den Internal STATE. Die beiden sind oft gleich - nicht immer!
Zitat
Da ich momentan sehr viel per list abfrage, was kann passieren ?
deine Formatierung ist glückssache.
wenn du ein Reading und ein Internal mit gleichem Namen kannst du nicht sagen, welches du bekommst.