Hallo zusammen,
zunächst erstmal vielen Dank an alle User dieses Forum´s. Ich habe hier schon viel lernen können und bin immer wieder fasziniert von den vielen zahlreichen innovativen Lösungen.
Nun zu meinem Problem, ein DS2413 steuert über PIO:A ein Wechsler-Relais zusammen mit einem Serienschalter in einer Wechselschaltung. Über PIO:B wird der Zustand der Lampe abgefragt, also ein "echter" Rückkanal. Über readingsProxy habe ich die Kanäle in Schalter und Lampe aufgeteilt. In meinem Floorplan, möchte ich nur die Lampen als schaltbares Toggle abhängig vom aktuellem Zustand der Lampe haben. Das funktioniert auch alles wunderbar, aber wenn ich das Licht über den Schalter wieder ausschalte und die Lampe wie im devStateIcon definiert wieder das icon wechselt, kann ich die Lampe mit erneutem click auf das icon nicht mehr anschalten. Ich vermute mal das, das im setFn seine Ursachen hat, da der Status des Rückkanals nicht berücksichtigt wird. Mit valueFn {$LASTCMD} geht es zwar, aber dann wird der Status des Rückkanal nicht mehr auf dem icon aktualisiert. Auch mit notify bin ich nicht zum gewünschten Erfolg gekommen. Wie müsste man den perl-code in setFn anpassen, so das der $Cmd-Befehl sich an state anpasst? Ich habe da leider kaum Erfahrung mit perl-code, oder gibts da eine andere Lösung? Google-Suche und dieses Forum hatte ich schon vergebens durchforscht, aber leider ohne Erfolg. Ich wäre für einen Tipp sehr dankbar.
ich bin mir nicht sicher ob ich dein problem richtig verstehe...
aber: ich würde den readingsProxy auf den rück kanal definieren so das er immer den korrekten zustand anzeigt und in der setFn das kommando auf den schalt kanal los lassen (und eventuell undef zurück geben). wenn der schaltvorgang erfolgreich war kommt das update ja dann automatisch wieder über den rückkanal rein.
der rest geht dann per passendem devStateIcon. toggle gibt es zwar automatisch brauchst du hier aber nicht.
gruss
andre
hallo andre,
das readingsProxy ist auf den rückkanal so definiert,
define WZCouchLampe readingsProxy WZCouchSchalter:B
das funzt auch wunderbar, wenn ich auf das icon anklicke wird das cmd auch auf den schalter so ausgeführt,
attr WZCouchLampe setFn {($CMD eq "AN")?"output A on":"output A off"}
und ist im devStateIcon so definiert
attr WZCouchLampe devStateIcon AN:FS20.on:AUS AUS:FS20.off:AN
aber, wenn ich am pc die lampe eingeschaltet habe und dann über den schalter wieder ausschalte, kann ich am pc nicht mehr einschalten,
da ja output A schon auf on ist und laut devStateIcon ein neuer on-befehl kommt und somit nichts ändert. d.h. ich müsste in setFn on und off als variable abhängig von state setzen,
also quasi ein pseudo-toggle dort machen, nur leider reichen ab dieser stelle meine sehr dürftigen perl-kenntnísse nicht mehr aus :(
vergiss mal für einen moment das schalten aus fhem heraus.
wenn du am schalter schaltest wird dann in fhem der aktuelle zustand angezeigt? wenn ja: sollte das icon automatisch wechseln und beim klick das passende entgegengesetzte kommando senden. wenn nein: dann wechselt das icon nicht und es wird das falsche kommando gesendet.
d.h. der rück kanal muss erst mal komplett gehen. wenn das funktioniert braucht du keine toggle logik bzw. die toggle logik steckt in deinem devStateIcon in dem du für den AN zustand das AUS kommando und für den AUS zustand das AN kommando hinterlegt hast.
erst wenn der rück kanal geht kommt das schalten dran. gib mal am ende der setFn undef zurück.
gruss
andre
ps: es empfiehlt sich wenn du on und off als kommandos verwendest nicht AN und AUS. denn bekommst du einige fhem interne defaults automatisch wie z.b. on-for-timer und ein echtes toggle kommando automatisch mit.
ja, zustand vom rückkanal wird auch bei schalterbetätigung angezeigt.
ich schmeiß mal AN AUS raus, vielleicht ist da der fehler ...
und das hier:
Zitatgib mal am ende der setFn undef zurück.
wenn der zustand bei schalterbetätigung richtig angezeigt wird und das icon wechselt muss beim klick auch das dazu passende kommando gesendet werden. sonst stimmt etwas nicht.
könntest du mir kurz die syntax für undef geben, weis leider nicht wie du es meinst, sorry
ich habe die formatierung AN AUS nun rausgeworfen, ergebnis ist aber leider noch das selbe,
habe es jetzt mit meiner lampe im flur ausprobiert, code sieht so aus:
define DieleSchalter OWSWITCH DS2413 AC0C1B000000
attr DieleSchalter IODev Arduino_Pin11
attr DieleSchalter group SCHALTER
attr DieleSchalter interval 1
attr DieleSchalter model DS2413
attr DieleSchalter room hidden
attr DieleSchalter webCmd on:off
define DieleLampe readingsProxy DieleSchalter:B
attr DieleLampe alias Lampe
attr DieleLampe devStateIcon OFF:FS20.on:off ONX:FS20.off:on
attr DieleLampe fp_Obergeschoss 343,662,0,DieleLampe,
attr DieleLampe group DIELE
attr DieleLampe room DIELE,ÜBERSICHT
attr DieleLampe setFn {($CMD eq "on")?"output A on":"output A off"}
attr DieleLampe setList on off
nicht über ONX wundern, ist kein tipfehler, das gibt Pio:B zurück als open drain, daher hatte ich auf AN AUS formatiert.
die befehle on und off bei devStateIcon müssten in abhängigkeit von state wechseln, dann würde es gehen
d.h.
ist state=OFF dann so,
devStateIcon OFF:FS20.on:off ONX:FS20.off:on
ist state=ONX dann so,
devStateIcon OFF:FS20.on:on ONX:FS20.off:off
könnte man an dieser stelle mit perl-code variablen die in setFn als if else anweisung und in abhängigkeit von state definiert sind einsetzen ?
wenn ja wie? da hörts bei mir leider auf :(
Zitatdie befehle on und off bei devStateIcon müssten in abhängigkeit von state wechseln, dann würde es gehen
genau das machen sie doch schon:
attr WZCouchLampe devStateIcon AN:FS20.on:AUS AUS:FS20.off:AN
wenn der aktuelle zustand AN ist wird beim klick AUS gesendet und wenn der aktuelle zustand AUS ist wird beim klick AN gesendet.
in deinem beispiel oben ist das attribut aber falsch gesetzt:
attr DieleLampe devStateIcon OFF:FS20.on:off ONX:FS20.off:off
du setzt bei beiden zuständen off.
wegen dem undef:
attr DieleLampe setFn {($CMD eq "on")?fhem("set $DEVICE output A on"):fhem("set $DEVICE output A off"); return undef}
Zitat von: justme1968 am 28 August 2016, 22:58:48
genau das machen sie doch schon:attr WZCouchLampe devStateIcon AN:FS20.on:AUS AUS:FS20.off:AN
wenn der aktuelle zustand AN ist wird beim klick AUS gesendet und wenn der aktuelle zustand AUS ist wird beim klick AN gesendet.
das stimmt, aber das ganze bezieht sich nur auf den port PIO:A des DS2413 definiert als WZCouchSchalter.
wenn ich am pc schalte wechselt der zustand von OFF auf ONX und ein Relais schaltet einen Wechselkontakt um und das bleibt dann auch so lange bis wieder der befehl "set WZCouchSchalter output A off"kommt, port PIO:B wechselt von ONX auf OFF wenn die lampe wirklich an geht (wert ist negiert, technisch bedingt)
schalte ich nun den "realen" Schalter an der Wand der auch ein Wechselkontakt hat um, bekomme ich den wert in PIO:B des DS2413 mit ONX bestätigt.
da nun das devStateIcon bedingt durch die zustandsänderung wieder FS20.off anzeigt, würde es beim erneuten anklicken ein on senden, was aber nichts ändert, da PIO:A bereits auf on (ONX) steht.
ein Wechsel würde hier nur durch "set WZCouchSchalter output A off" stattfinden.
ich weis klingt alles ziemlich verwirrend, danke für deine geduld sich am sonntag abend mit meinem misst rumzuschlagen.
in deinem beispiel oben ist das attribut aber falsch gesetzt:attr DieleLampe devStateIcon OFF:FS20.on:off ONX:FS20.off:off
du setzt bei beiden zuständen off.
komisch, hatte ich so nicht gepostet ? ???
BERICHTIGUNG !
"... bekomme ich den wert in PIO:B des DS2413 mit OFF (nicht ONX, TIPPFEHLER!) bestätigt."
Ich muss jetzt ins Bett, sonst kommt hier noch mehr Verwirrung rein, Guts Nächtle ::)
du musst jeden möglichen zustand im deevStateIcon berücksichtigen. wenn es neben on und off noch etwas anderes gibt auch dafür. wenn der zustand mehrdeutig ist hast du ein problem.
du kannst für devStateIcon auch {...} perl code haben der dann den aktuellen icon string zurück gibt. dieser weg ist besser als in die setFn etwas einzubauen weil es dann auch geht wenn du extern schaltest.
gruss
andre
hallo andre,
nunja scheint wohl so, das ich ohne einen angepassten perl code für meine problemstellung zu keiner sinnvollen lösung komme.
nochmal zum grundverständnis, damit ich mich nicht bei meinen ersten programmierversuchten in perl verrenne,
syntax devStateIcon
Zustand:Name_des_Files:Befehl_beim_anklicken_wie_in_setFn_definiert
bsp.
attr DieleLampe devStateIcon OFF:FS20.on:off ONX:FS20.off:on
attr DieleLampe setFn {($CMD eq "on")?fhem("set DieleSchalter output A on"):fhem("set DieleSchalter output A off");; return undef}
heist also übersetzt, wenn ich auf das icon FS20.off klicke, setze DieleSchalter output A on, anderfalls setze DieleSchalter output A off.
da in meinem fall sich die werte on/off bei jeder zustandsänderung in abhängigkeit der werte von PIO:A und PIO:B zueinander ändern müssten,
müsste ich dies durch passende variablen ersetzen, z.bsp. so,
attr DieleLampe devStateIcon OFF:FS20.on:{$x} ONX:FS20.off:{$y}
wenn ich das aber nicht in setFn definieren soll, wo dann ?
attr <device> devStateIcon {...}
... ist perl code der den richtigen icon string zurück liefert. etwas in der art:{myPioIcon($name)}
und in 99_myUtils.pm legst du eine routine an:sub
myPioIcon($)
{
my ($name) = @_;
if( ... ) {
return "OFF:FS20.on:on";
} elsif( ... ) {
return "ONX:FS20.off:on";
...
}
du musst das ganze auf ebene des icons lösen. nicht auf ebene der setFn. sonst ist dein icon nicht synchron zum tatsächlichen zustand.
gruss
andre
ah, super, danke für die unterstützung, dann werde ich mal meine erste perl-routine schreiben, wie geil ist das denn ... ;D