Gelöst - Geräte schalten sich unkontrolliert

Begonnen von ftsinuglarity, 01 Oktober 2017, 16:29:36

Vorheriges Thema - Nächstes Thema

ftsinuglarity

Hallo,

ich hoffe, die Allgemeinheit meiner Frage ruft nicht nur Kopfschütteln hervor, Code reiche ich gerne nach wenn erforderlich.
Ich habe momentan das Problem (bin seit rund anderthalb Monaten auf FHEM umgestiegen), das sich Geräte unkontrolliert schalten. Z.B. habe ich einen Button "Sleep", der alles ausschaltet, wenn ich, naja, ins Bett gehen will, bis auf ein "Pathlight", also 2 Lampen die mir den Weg beleuchten und nach 5 Minuten ausgehen.
Meiner Meinung nach gibts da nicht viel falsch zu machen, trotzdem hatte ich dann solch Phänomene, das sich einige Lichter nach rund 30 Sekunden wieder anschalten.
Das ist nur ein Beispiel, ist mir bei mehreren Geräten passiert.
Die Frage, die sich mir stellt ist: ist das bekannt, wenn man bestimmte Sachen nicht beachtet, was wäre ein typischer Auslöser für so ein Verhalten?
Die einzigen Zeitauslöser die ich habe sind 2 Geräte (eins ein Staubsauger, eins ein Handy, was pro Tag einmal eine halbe Stunde eingeschaltet wird um nachzuladen)
Sieht so aus:
# Staubsauger jeden Tag laden
define atStaubsauger at *13:00:00 { fhem ("set Staubsauger on;;define atStaubsaugerTimer at +00:30:00 set Staubsauger off")}
define fl_Staubsauger FileLog log/bedingungen.log      atStaubsauger
attr fl_Staubsauger room 9.2_Logfiles


# Küchenhandy jeden Tag laden
define atHandy_Laden at *15:00:00 { fhem ("set KUE_Bluetooth_Lautsprecher on;;define atHandy_Laden_Timer at +00:30:00 set KUE_Bluetooth_Lautsprecher off")}
define fl_Handy_Laden FileLog log/bedingungen.log      atHandy_Laden
attr fl_Handy_Laden room 9.2_Logfiles


Meines Gefühls nach tritt das auf, seitdem ich structs eingeführt habe. Ich habe schon sämtliche Einträge, die automatisch gesetzt werden, rausgenommen... sie werden ja wieder reingeschrieben. Sah erstmal gut aus, aber wars nicht wirklich.

Also, wo könnte ich ansetzen, was könnte, ganz allg. ein (bekannter) Auslöser sein?


Um euch nicht ganz im dunkeln zu lassen vlt doch nochmal ein wenig Code.
So zb habe ich ein virtuellen Schalter für die Musikanlage angelegt:
####################################
# TV + ANLAGE + LICHT
#####################################
define WZ_MEDIA dummy
attr WZ_MEDIA group Dummy's
attr WZ_MEDIA room 9.4_Dummy's,2.1_Wohnzimmer
attr WZ_MEDIA webCmd on:off
define nWZ_MEDIA notify WZ_MEDIA          {    if ($EVENT eq "on" ) {\
                                       fhem("\
                                             set WZ_STATUS MEDIA_ON;; \
                                             set Musik on;; \
                                             set stNetzwerk on;;\
                                             set WZ_Licht_Tisch_Hell off;; \
                                          ");;\
                                       if ( Value("Licht_An_Zeit") eq "1" ) {\
                                          fhem("\
                                                set stWZ_Licht_Sanft on;; \
                                          ")}\
                                       }\
                                    else {\
                                       fhem("set Musik off");; }\
                                 }
attr nWZ_MEDIA room 9.3_Notifys


Das "set WZ_STATUS MEDIA_ON;;" ist nur ein Dummy, der mir in der Oberfläche anzeigen soll, ob ein übergreifendes Dummy an- oder ausgeschaltet ist (seht ihr ja im Code)





rudolfkoenig

Bei "attr global verbose 3" (Voreinstellung) sollte man im FHEM-Log sehen, wenn FHEM etwas schaltet (wenn der Modulautor sich an die Log-Vorgaben haelt). Wenn man "attr global verbose" erhoeht, dann kann man (mit etwas Fleiss und Geduld bzw. Uebung) aus dem FHEM-Log auch rauslesen, wer oder was diese Aktion ausgeloest hat. Das FHEM-Log kann man auch im Event Monitor beobachten.

Sonst: ich wuerde "set Staubsauger on;;define atStaubsaugerTimer at +00:30:00 set Staubsauger off" eher als "set Staubsauger on;;sleep 1800;; set Staubsauger off", oder wenn das Geraet das unterstuetzt, als "set Staubsauger on-for-timer 1800" schreiben.

ftsinuglarity

Hallo Rudlof, danke für die schnelle Antwort. Vlt mal zum meinem momentanen Wissenstand: Bei FHEM durchzublicken war anfangs nicht leicht, mittlerweile habe ich etwas mehr als eine Idee wie das ganze funktioniert. Das beinhaltet auch solche Dinge wie verbose, Event Mangager usw. Ich komme aus der IT Branche, sind also nicht alles böhmische Dörfer ;)
Konkreter:
Logs: Tatsächlich ein wenig schwer durchzusteigen, da oftmals structs im Log durchlaufen werden, die eingentlich nichts mit der Schaltung zu tun haben (werden immer alle durchlaufen ? )
Da werden structs als "on" bewertet , bei denen ich mich frage, was die damit zu tun haben. Da fehlt mir noch Wissen an der Stelle. Resultat: ich blicke bei den Logs inhaltlich manchmal nicht so ganz durch.
Bin insg. noch viel am ausprobieren.

Der Staubsauger: die Schaltung an sich funktioniert. Ist ein Roboter, den ich nicht direkt ansteuern kann leider, der hängt ganz simpel an eine IT .. viel mehr als on - off geht nicht, reicht auch.

Ich beschreibe mal eine Struct (ist wegen der Rückgabewerte noch nicht ganz korrekt)
set stNetzwerk on;;  (aus dem vorherigen Beispiel)
#####################################
# Netzwerk                        ##
# internes Netz
define stNetzwerk structure stNetzwerkTag                              FL_Router_intern Ediplug_Zotac
attr stNetzwerk userattr stAlleGeraeteTag stAlleGeraeteTag_map structexclude

Untere Line wird automatisch eingefügt.
FL_Router ist ein Router für das interne Netzwerk (WLAN)
Der wiederum hängt hinter einem Server an einem Ediplug (Ediplug_Zotac)
Beide müssen an sein, damit ich Musik zB über Spotify abspielen kann.

Ich denke eher, das ich mit den structs irgendwas nicht begriffen habe, da gefühlt seitdem die Probleme auftauchen.

Danke an Antwortende für ihre Zeit und Geduld !



rudolfkoenig

Zitatder hängt ganz simpel an eine IT .. viel mehr als on - off geht nicht, reicht auch.
Wenn ich recht sehe, verwendet das IT Modul SetExtensions, und damit sollte beim vorhandenen on und off auch on-for-timer, on-till, etc gehen.

ZitatIch denke eher, das ich mit den structs irgendwas nicht begriffen habe, da gefühlt seitdem die Probleme auftauchen.
Bei den structure Attributen muss ich auch immer Zeit nehmen mich reinzudenken, bis ich eine Frage beantworten kann :)

ftsinuglarity

Verwende ich set Extensions ? :) Schaue ich mir nachher nochmal an. Die eigentliche Frage ist aber nicht, ob der Staubsauger noch anders programmierbar wäre, der funktionierte. Er steht nur stellvertretend und als Beispiel.
Eine Frage wäre zb, ob immer alle structs durchlaufen werden, oder ob ich im Grundsatz etwas falsch denke, weil das passiert? (Somit: Was kann auslöser für ein derartiges Falsch-Schalten-Verhalten sein. Was weiß ich noch nicht oder habs falsch verstanden?)

rudolfkoenig

ZitatEine Frage wäre zb, ob immer alle structs durchlaufen werden
Weiss nicht genau, was damit gemeint wird, ich rate: Wenn man set bei einem Structure-Instanz absetzt, dann wird das set Befehl bei allen in diesem Structure definierten "Mitgliedern" abgesetzt.
Fuer die andere Richtung (Anzeige der Mitglied-Stati im Structure) muss man weitere Attribute setzen.

ftsinuglarity

#6
Mal kurz völlig ab vom Thema. Wie gebt ihr Werte auf die Schnelle aus ? Also den Wert von $Event beispielsweise? Popup, Dummy ... ?

Ich schau mir grad die Logs an, und was da genau passiert, bevor ich weiterschreibe, damit ich konkretere Fragen stellen kann.
Um mir zB selber die Frage zu beantworten, ob IMMER ALLE structs durchlaufen werden (das meinte ich Rudolf, ist manchmal nicht leicht so zu formulieren, das jeder versteht was gemeint ist. Sorry) .. werden sie nicht. Allerdings die structs, die den Schalter beinhalten, auch wenn nur ich den "puren" Schalter betätige. Der tiefere Sinn erschließt sich bei mir noch nicht, den wirds aber sicher geben.
Hab auch langsam den Verdacht, das einer meiner Nachbarn meine Geräte (ebenfalls automatisch) schaltet, was die Zeitverzögerung, mit der meine Lampen einfach wieder angeschaltet werden, erklären würde. Mal schauen ob noch geschaltet wird, wenn ich den DIP Code  verändere ) ... ich melde mich, wenn ich nicht weiterkomme... oder gebe andernfalls ein abschließendes Statement. Bin sicher nicht der einzige, der "merkwürde Phänomene" hat, und hierdurch vlt. einen Ansatzpunkt mehr.
Vielen Dank an dich Rudolf.



(Edit: nach kurzem Überlegen ist es doch sinnvoll die betreffenden structs zu durchlaufen. Irgendwie muß die Structur informiert werden, damit sie ihren Status eventl. ändern kann (je nach Definition, Stichwort clientstate)

ftsinuglarity

#7
Ich konnte das Problem ein wenig eingrenzen.

Aus den Logs:
Alle paar Minuten (ich hatte erst ein Intervall von 4, jetzt eines von 2 Minuten) wird:

2017.10.02 20:52:33 3: CUL IT_set: FL_Router_intern on
2017.10.02 20:52:34 3: CUL IT_set: WZ_Licht_Tisch_Hell off
2017.10.02 20:52:34 3: CUL IT_set: WZ_Stromleiste_Sofa on
2017.10.02 20:52:34 3: CUL IT_set: WZ_Licht_PC on
2017.10.02 20:52:35 3: CUL IT_set: WZ_Licht_Sofa_Kristall on
2017.10.02 20:52:35 3: CUL IT_set: WZ_Licht_bei_Terrarium on


ausgeführt. Das ist die Konfiguration des Notify's für:

dWZ_MEDIA

.. der Dummy-Button den ich als Auslöser für die Fernsehumgebung nutze. Genau die Lampen, die immer wieder angeschaltet wurden. Das hieß zB, das die Lampen im Wohnzimmer heute morgen alle an waren. Nicht so geil auf Dauer :D. Notlösung wäre über Nacht fhem abzuschalten.

Ich habe mir erst keinen Reim darauf machen können, weil ausgerechnet der TV nicht angeschaltet wird, der fehlt dort, ebenso ein 2. Ediplug für das Netzwerk. Es sah erst ziemlich wahllos aus.

Der TV+Verstärker hängt an einem Ediplug SP2101W, der Anlage und TV anschaltet.
Mein Intervall für den Ediplug war auf default 120 Sekunden eingestellt.


define Musik EDIPLUG 192.168.x.x
...
attr Musik interval 120
..



In den Logs ist dann zu sehen, das nMusik  alle 120 Sekunden aufgerufen wird, das Notify des Ediplugs, das eskaliert dann weiter, was wie folgt aussieht:
dDevicename => Dummy
stName          => struct
alles andere direkte Devices


2017.10.02 23:22:20 4: nMusik exec {    if ($EVENT eq "off") {  fhem("setreading dWZ_MEDIA state off;;")}
                                                              else {fhem("setreading dWZ_MEDIA state on;;")}
                                                           }

2017.10.02 23:22:20 4: nWZ_MEDIA exec {     if ($EVENT eq "on" ) {
                                                                                      fhem("
                                                                                           set Musik on;;
                                                                                           set stNetzwerk on;;
                                                                                           set WZ_Licht_Tisch_Hell off;;
                                                                                        ");;
                                                                                         if ( Value("dLicht_An_Zeit") eq "1" ) {
                                                                                                     fhem("set stWZ_Licht_Kristall on;;")
                                                                                                }
                                                                                }
                                                                                else {
                                                                                         fhem("set Musik off");;
                                                                                        }
                                                                                }

..
2017.10.02 23:22:20 3: CUL IT_set: FL_Router_intern on
2017.10.02 23:22:20 3: CUL IT_set: WZ_Licht_Tisch_Hell off
2017.10.02 23:22:21 3: CUL IT_set: WZ_Stromleiste_Sofa on
2017.10.02 23:22:21 3: CUL IT_set: WZ_Licht_PC on
2017.10.02 23:22:22 3: CUL IT_set: WZ_Licht_Sofa_Kristall on
2017.10.02 23:22:22 3: CUL IT_set: WZ_Licht_bei_Terrarium on



Nur die beiden Ediplugs fehlten.
Die Ediplugs liefern im Log ein timeout. Sie können connected werden, der xml-string vom Ediplug kommt aber nicht komplett an .. dann timeout.
Den habe ich schon auf 10 hochgesetzt. Hilft nicht wirklich, aber ist ein anderes Thema.  Direkt schalten kann ich sie, die Logs sehen dann gut aus, nur im automatischen intervall werden sie eben nicht ausgelöst.

Das endete in der unerwarteten Lichtershow, Geräte haben sich bis auf den Router nicht angeschaltet.


Unglück von mir gesetzt ist hier anscheinend das Notify nMusik. Mir war nicht klar, das eine Abfrage durch attr .. interval 120 oder ein Fehler, in diesem Fall der ediplug-timeout, das Notify auslöst. Es sei denn der Zustand hat sich geändert.  Ist das tatsächlich so gedacht?

Ursprünglich war dieses Notify eigentlich nur dazu gedacht, einen Dummy-Button zu informieren (dWZ_MEDIA)
dWZ_MEDIA beinhaltet den TV, Anlage, ein paar Lichter (auch ein struct)

Zusätzlich habe ich den Button für die Anlage+TV  an sich (Ediplug:Musik) .

Die Idee war, den Status von Musik auf dWZ_MEDIA (und umgekehrt) zu übertragen, und somit auch auf beiden Buttons grafisch dargestellt zu sehen, ob die stromfressende Anlage an ist.

Das sollte ich wohl anders lösen. Zumal der "Einzel-Button" jetzt auch immer das komplette dWZ_MEDIA Programm abrattert.

Wie sollte soetwas korrekt bewerkstelligt werden ? Ich würde mich über Anregungen freuen.
Auch würde ich weiterhin gern wissen, wie ihr beliebige Werte ausgebt. Also so etwas wie $EVENT, oder irgendwelche Rückgabewerte.





( Die Einrückungen im Code oben sind durch die Logs verzerrt, ich habe schon ein wenig korrigiert, damit es leserlicher wird. In der config ists richtig definiert.)







CoolTux

Du kannst wegen meiner ganze Romane schreiben, so lange Du uns nicht das notify zeigst und ein list vom Device auf welches das Notify triggern soll bleibst Du hier allein Unterhalter.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ftsinuglarity

ZitatDu kannst wegen meiner ganze Romane schreiben, so lange Du uns nicht das notify zeigst und ein list vom Device auf welches das Notify triggern soll bleibst Du hier allein Unterhalter.
:D

War nicht meine Absicht mit zuviel Text zu langweilen. Ich wollte aufzeigen, wie es zu solchen "Phänomenen" kommen kann, war schon ne schräge Nummer mit ner Menge Fragezeichen und Frustration. Ging meiner Meinung nach nicht viel kürzer, wenn es nachvollziehbar sein sollte.


Der Musik Dummy:


##### Musik / TV ########
# Device
define Musik EDIPLUG 192.168.x.x
attr Musik userattr stAlleGeraeteExclTag stAlleGeraeteExclTag_map stAlleGeraeteTag stAlleGeraeteTag_map structexclude
attr Musik alias TV - Musik
attr Musik devStateIcon on.*:ios-on-green off:ios-off
attr Musik group Multi-Media
attr Musik icon it_television
attr Musik interval 900
attr Musik model SP2101W
attr Musik password pw
attr Musik read-only 0
attr Musik room 1_Wohnung,2.1_Wohnzimmer
attr Musik stAlleGeraeteExclTag stAlleGeraeteExcl
attr Musik stAlleGeraeteTag stAlleGeraete
attr Musik timeout 10
attr Musik user admin
attr Musik verbose 5


Das Notify dazu:

define nMusik notify Musik { if ($EVENT eq "off") {\
fhem("setreading dWZ_MEDIA  state  off;;")}\
else {\
fhem("setreading dWZ_MEDIA state  on;;")}\
}



dWZ_MEDIA Dummy

#####################################
# TV + ANLAGE + LICHT
#####################################
define dWZ_MEDIA dummy
attr dWZ_MEDIA group Dummy's
attr dWZ_MEDIA room 9.4_Dummy's,2.1_Wohnzimmer
attr dWZ_MEDIA webCmd on:off
define nWZ_MEDIA notify dWZ_MEDIA { if ($EVENT eq "on" ) {\
fhem("\
set Musik on;; \
set stNetzwerk on;;\
set WZ_Licht_Tisch_Hell off;; \
");;\
if ( Value("dNightTime") eq "1" ) {\
fhem("\
set stWZ_Licht_Kristall on;; \
")}\
}\
else {\
fhem("set Musik off");;\
}\
}
attr nWZ_MEDIA room 9.3_Notifys



Wenn noch irgendetwas benötigt wird, füge ich das gerne an.

Inzwischen habe ich das Notify nMusik erstmal von setreading  auf:

fhem("setstate dWZ_MEDIA on;;")}\

Laut commandref werden beim setreading Events getriggert, bei setstate nicht.
So ist es dann auch, das Hin und Hergeschalte hat ein Ende.

Meine ursprünliche Frage ist also geklärt, die Schaltungen an sich funktionieren wieder.


Mit obenstehndem, ähm, Monolog ? :D .. als Ausgang, kann ich jetzt in den Logs sehen, daß das Notify nMusik 6x aufgerufen wird, egal ob über den Einzelbutton für die Anlage, den Sammel-Dummy für Anlage+TV+Licht oder attr ... intervall. Das sieht so aus:

2017.10.03 15:18:08 4: nMusik exec {    if ($EVENT eq "off") {
                                                                                fhem("setstate  dWZ_MEDIA  off;;")}
                                                                        else {
                                                                                fhem("setstate dWZ_MEDIA on;;")}
                                                                }
2017.10.03 15:18:08 4: nMusik exec {    if ($EVENT eq "off") {
                                                                                fhem("setstate  dWZ_MEDIA  off;;")}
                                                                        else {
                                                                                fhem("setstate dWZ_MEDIA on;;")}

......


Wenn ich setstate richtig verstanden habe, sollte es doch kein Event , und damit kein Notify auslösen. Andernfalls laufe ich in eine Schleife.
setstate schaltet demnach keine Geräte per Event, macht aber eine art setstate auch bei Notify Geräten des Zieldummies. So erkläre ich mir das mehrfache ausgelöste Notify.





Wie erreiche ich es, das 2 Buttons den Zustand eines Gerätes erhalten, ohne dabei einen dritten Dummy zu nutzen? So wie ich mit das gedacht habe ist es bullshit. Allein die Möglichkeit in eine Schleife zu geraten würde ich gern vermeiden. Ich stehe auf dem Schlauch.
(Vielleicht sollte der Thread auch in den Anfängerbereich verschoben werden, keine Ahnung.)


Als Webinterface nutze ich die tablet ui.
Da sieht die Konfiguration im Moment so aus:



<!-- Musik / TV + Licht -->
<div class="cell " >
<div data-type="switch"
data-device="dWZ_MEDIA"
data-get-on="on"
data-get-off="off"
data-set-on="on"
data-set-off="off"
data-icon="fa-television"
data-background-icon="fa-square"
data-on-background-color="green"
data-off-background-color="orange"
data-on-color="white"
data-off-color="black"
>
</div>
<div data-type="label" class="thin">Musik/TV </div>
</div>

Der Einzelbutton für die Anlage:
<div class="cell" >
    <div  data-type="switch"
        data-icon="fa-television"
        data-device="Musik"
data-get-on="on"
        data-get-off="off"
data-set-on="on"
        data-set-off="off"
data-states='["on","off"]'
        data-icons='["fa-television", "fa-television"]'
        data-colors='["white", "black"]'
        data-background-colors='["green", "grey"]'
data-background-icon="fa-square"
        class="tiny">
    </div>
    <div data-type="label" data-device="Musik" data-get="onoff" class="thin" ></div>





(ist wieder etwas mehr Text geworden, sorry, kanns grad nicht kompakter erklären. Ich bemühe mich um Kürze das nächste Mal)

CoolTux

Das sind zwar immer noch keine list aber egal.
Setze event-on-change-reading .*
Bei m ediplug Device Musik und baue setreading wieder ein.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ftsinuglarity

Sorry, ich dachte die Konfiguration wäre nachvollziehbarer.



Internals:
   CFGFN      ./configs/virtual_devices.cfg
   NAME       dWZ_MEDIA
   NR         614
   STATE      on
   TYPE       dummy
   READINGS:
     2017-10-03 17:16:39   state           on
Attributes:
   group      Dummy's
   room       9.4_Dummy's,2.1_Wohnzimmer
   webCmd     on:off

CoolTux

Wieso machst du eigentlich bei einem Dummy ein setstate oder setreading. Einfach ein set dWZ_MEDIA on und gut ist.
Und setze das Attribut was ich oben genannt habe.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ftsinuglarity

Wenn ich set dWZ_Media on setze, wird der Event komplett ausgelöst (also Licht, Anlage usw)
Das möchte ich nicht, wenn ich nur die Anlage einschalte (der Einzelbutton)

CoolTux

#14
Dann setze doch einzelne Set Befehle passend zum Reading
setList und readingList immer die selben Werte. Dann macht ein set device bla on ein Reading bla on und ein set device blu off ein Reading blu off

Und dann triggerst du die Readings entsprechend wie du es brauchst.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net