listenonly, readonly, ...

Begonnen von NehCoy, 11 Dezember 2017, 18:35:59

Vorheriges Thema - Nächstes Thema

NehCoy

Guten Abend!

Ich habe mal ein Frage zu listenonly bzw. readonly. - In der Referenz steht ja folgendes:
Zitatlistenonly

    Wenn auf 1 gesetzt, kann das Gerät keine Nachrichten senden. Sowohl Leseanfragen als auch get sind verboten.

readonly

    Wenn auf 1 gesetzt, kann das Gerät keine Nachrichten senden. Leseanfragen sind verboten. Get ist erlaubt.

Ist jetzt mit Gerät das KNX-Gerät, oder das FHEM-Gerät gemeint?

Irgendwie funktioniert nämlich "notify" bei einem KNX-Gerät nicht, bei dem listenonly auf 1 gesetzt ist ...

Danke & Grüße
NehCoy

Andi291

Servus!

Natürlich ist das FHEM-Gerät gemeint.

Komisch, bei mir funktionieren auch notifies auf listenonly-Geräte. Hast Du im Event-Monitor gegengeprüft?

NehCoy

Guten Abend!

Zitat von: Andi291 am 11 Dezember 2017, 19:37:44
Hast Du im Event-Monitor gegengeprüft?

Nein. Das Event tritt doofer Weise immer nur einmal am Tag ein, wenn ich natürlich nicht zu Hause bin.
Im Event-Monitor sehe ich ja immer die aktuellen Events.
Ich sehe aber an anderer Stelle, dass das Event (Zuständsänderung) aufgetreten ist. - Wird ja agezeigt.
Nur die Aktion passiert eben nicht ...

Grüße
NehCoy

docm

Funktioniert es denn, wenn listenonly nicht gesetzt ist?
Solange du nicht selbst von FHEM aus auf die GA sendest, ist es ja eigentlich egal, ob das Attribut gesetzt ist oder nicht. Insofern erschließt sich mir der Sinn von listenonly und readonly ohnehin nicht so ganz...
Viele Grüße
Andreas

NehCoy

Werde ich morgen sehen ...
Im Moment bin ich noch auf Fehlersuche!
Nur mit Dummys funktioniert es ...

NehCoy

Ähm nicht wirklich! Fällt mir eben auf!

Ich habe das "set ... on" um ein "at" ergänzt:
    if($test eq "on" )
    {
      fhem ("set dy.test on;; define Weihnachtsbeleuchtung.Automatik.Off_Active at +00:00:20 set dy.test off")
    }


Das Dummy-Gerät dy.test hat den Wert/Status
on; define Weihnachtsbeleuchtung.Automatik.Off_Active at +00:00:20 set dy.test off
Und nicht "on"!

Das "at" wird jedoch richtig angelegt, so dass nach 20 Sekunden Dummy-Gerät dy.test auf "off" gesetzt wird.

Hä!?

Gruß
NehCoy

docm

#6
Innerhalb von fhem() steht EIN FHEM Kommando. Also eher dann so etwas wie

if($test eq "on" )
{
      fhem ("set dy.test on");
      fhem("define Weihnachtsbeleuchtung.Automatik.Off_Active at +00:00:20 set dy.test off");
}


Mit set-on-for-timer geht es möglicherweise einfacher.
Warum das AT vermeintlich funktioniert?? Misteriös...
Andreas

Edit: Es können auch mehrere FHEM-Kommandos in einem Aufruf von fhem() enthalten sein. Die erste Aussage oben ist also falsch. Siehe weiter unten im Thread.

NehCoy

Hi!

Sicher?
Also hnach den Beispielen hier müsste es funktionieren:
https://wiki.fhem.de/wiki/If-condition
https://wiki.fhem.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen

Aber ja! - So geht es besser!

Und warum nur !;! am Ende eine Zeiler und nicht zwei ";;" ?

Danke & Grüße
NehCoy

P.S.:
Danke mi dem Tipp mit "set-on-for-timer". - Schaue ich mir mal an.

docm

Kleiner Nachtrag (man lernt nie aus):
Tatsächlich kann man auch im Aufruf der Perl Funtion fhem() mehrere FHEM Kommandos durch ; getrennt hintereinander eingeben. Kam mir bislang nie in den Sinn, bin eher vom Typ eine Programmzeile = ein Befehl

NehCoy, dein Problem lag eigentlich nur daran, dass du ;; geschrieben hattest und nicht ;

Nun ist das auch alles andere als intuitiv. Auch nach mehreren Monaten FHEM-Erfahrung stolpere ich selbst immer wieder darüber. Grundsätzlich hängt die ;-Verdoppelung nämlich hauptsächlich davon ab, wo man die Eingabe macht

Eingaben in der FHEMWEB Kommandozeile werden direkt als FHEM Kommandos interpretiert. Taucht hier ein ; auf, wird es als Trennzeichen zwischen FHEM-Kommandos interpretiert. Will man dagegen ein ; als Textzeichen haben, muss man es verdoppeln. Ähnlich steht es um den Zeilenumbruch: Er wird als Abschluss des letzten FHEM-Kommandos interpretiert. Will man innerhalb des FHEM-Kommandos einen Zeilenumbruch, muss unmittelbar davor ein \ eingefügt werden.

Ein Beispiel

defmod testnotify notify testnotify {\
fhem("set Wohnzimmer.Funksteckdose on;; defmod testat at +00:00:10 set Wohnzimmer.Funksteckdose off");;\
}

Wenn man dies in die Befehlszeile eingibt wird ein "notify" definiert mit folgender Funktion:
Aktiviert man es mittels trigger testnotify wird
1. Wohnzimmer.Funksteckdose eingeschaltet und
2. ein "at" definiert, dass sie 10 Sekunden später wieder ausschaltet
Wichtig für das Verständnis:
Mit der Eingabe wird nur EIN Kommando ausgeführt, nämlich das defomod testnotify. Wäre das ; nicht verdoppelt worden, wäre der Eingabetext an dieser Stelle in zwei Kommandos aufgespalten worden, die dann allerdings Schrott sind.
Erst bei trigger testnotify werden dann zwei Kommandos ausgeführt.

Wenn man im FHEMWEB auf das DEF des testnotify klickt, öffnet sich ein kleines Fenster und darin sieht derselbe Code etwas anders aus:

testnotify {
fhem("set Wohnzimmer.Funksteckdose on; defmod testat at +00:00:10 set Wohnzimmer.Funksteckdose off");
}

Es kommt also darauf an, wo man die Eingabe macht. Bei komplexen Definitionen, mache ich es meistens so, dass ich in der FHEMWEB Kommandozeile nur eine erste Rumpfdefinition mache und dann in das DEF-Fenster gehe, weil ich hier komfortabel mehrzeilig editieren kann und mir keine Gedanken über Verdoppelungen und Zeilenumbrüche machen muss.

Nun werden sicher viele sagen, das Beispiel ist aber umständlich programmiert. Sie haben recht. Es ist ziemlich unsinnig zunächst mittels { } in den Perl Modus zu wechseln, um dan dort nichts weiter zu tun als die fhem() Funktion aufzurufen.

Man kann einfacher direkt im FHEM Modus bleiben. Die Definition über FHEMWEB-Kommandozeile sieht so aus:

defmod testnotify notify testnotify set Wohnzimmer.Funksteckdose on;; defmod testat at +00:00:10 set Wohnzimmer.Funksteckdose off


und im DEF-Fenster so:

testnotify set Wohnzimmer.Funksteckdose on; defmod testat at +00:00:10 set Wohnzimmer.Funksteckdose off

Zur besseren Übersicht kann man im DEF-Fenster auch Zeilenumbrüche einführen, z.B.

testnotify set Wohnzimmer.Funksteckdose on;
defmod testat at +00:00:10 set Wohnzimmer.Funksteckdose off

Aber Vorsicht: Ein Zeilenumbruch hinter off würde zu einem Fehler führen, denn der String "off<Zeilenumbruch>" ist nicht gleich "off"
Es ist eine der großen Tücken in FHEM, dass minimale und für den Menschen unsichtbare Änderungen (z.B. ein zusätzlicher Zeilenumbruch) zu Fehlern führen und die Fehlermeldung dann oft auch nicht weiter hilft. Da muss man sehr präzise arbeiten.

Ich hoffe, das Beispiel hilft dem einen oder anderen in ähnlich gelagerten Problemen. Hat allerdings nichts mit KNX zu tun...
Viele Grüße
Andreas