NEWS
[Gelöst] Keymatic Fernbedienung mit SPS
-
Hallo liebe Wissenden.
Ich habe mehrere Keymatic Türschlössen und auch die Fernbedienungen. Zum öffnen/schließen habe ich in der
Homematic eine direkte Verknüpfung der Fernbedienungstasten mit der Keymatic angelegt. Das funktioniert auch.
Ich frage auch das Zustandsflag der Keymatic über IOBroker ab und signalisiere den Zustand der Keymatic auf
einen SPS Ausgang.
Jetzt gibt es noch eine Taste Licht an der Fernbedienung. Damit möchte ich auch was machen, bekomme es aber
nicht hin. Schau ich mir den Status bei Objekte an und betätige die Taste, dann steht da immer true und es
ändert mal kurz die Farbe, aber sonst nix.
Gruss.
ToBo
-
Ja, das ist so, das passt.
Der "true" Zustand wird quasi beim Drücken der Taste "aufgefrischt".
In Javascript kannst Du darauf z.B. reagieren mit:
subscribe ({id: "hm-rpc.0.ABCxxxxxxx.1.PRESS_SHORT", val:true}, function(data) { // mach was, z.B Licht einschalten setState("hm-rpc.0.DEFyyyyyyyy.1.STATE",true); });
Die Id's musst Du natürlich entsprechend anpassen.
CU
Werner
-
Oha…. Ich habe das mit on..... versucht und geht natürlich nicht.
Was bedeutet denn nun Subscribe ?
-
Das sind Synonyme, das sollte egal sein.
-
subscribe ({id: "hm-rpc.0.ABCxxxxxxx.1.PRESS_SHORT", val:true}, function(data) { // mach was, z.B Licht einschalten setState("hm-rpc.0.DEFyyyyyyyy.1.STATE",true); });
OK, das funktioniert. Nun versuche ich den Ausgang bei jedem neuem Tastendruck umzuschalten.
So wird er einmal eingeschaltet und nie wieder aus.
Ich habe mir das so gedacht. geht natürlich nicht
var idSrc = "hm-rpc.0.OEQ0119854.3.PRESS_SHORT"; var idDst = "s7.0.Outputs.0.Lin_Licht"; subscribe ({id: "hm-rpc.0.OEQ0119854.3.PRESS_SHORT", val:true}, function(data) { // mach was, z.B Licht einschalten IF ( idDst == "1") { setState("s7.0.Outputs.0.Lin_Licht",true); } IF ( idDst == "0") { setState("s7.0.Outputs.0.Lin_Licht",false); } });
-
Tip: Bau es die Mal in blockly zusammen und schaue dann was für ein Code generiert wird und wo die Unterschiede mit deinen sind?
–-----------------------
Send from mobile device
-
Damit komme ich schon gar nicht klar. Das verstehe ich noch nicht.
Ich muss einfach erst mal die Syntax verstehen.
-
Ok mal schnell so per tapatalk
Deine eerste variabele sagt nichts, da muss nog ein .State oder val hinter.
Wen du jetzt log(idSrc) hinzufügt ist diese bestimmt Lehr oder [object].
Muss sonst nachher Mal am pc Schaun ob da noch mehr ist?
Ich verstehe auch nicht ganz warum du diese Variable benutzt.
Kannst Mal dein usecase schreiben was du erreichen möchtest hilft in der logic…
Send from mobile device
-
Ich habe nun das.
var idSrc = "hm-rpc.0.OEQ0119854.3.PRESS_SHORT"; var idDst = "s7.0.Outputs.0.Lin_Licht"; var Flag = "s7.0.Markers.0.Flag_Licht"; subscribe ({id: "hm-rpc.0.OEQ0119854.3.PRESS_SHORT", val:true}, function(data) { setState(Flag,true); //log("s7.0.Markers.0.Flag_Licht".State) }); on(Flag, function(dp) { // Triggern bei Änderung IF ( IdDst.State == "0" ); { setState(idDst,true); setState(Flag,false); } IF ( IdDst.State == "1" ); { setState(idDst,false); setState(Flag,false); } });
Der Merker wird auf 1 gesetzt, aber dann kommt eine fette Fehlermeldung.
Taste Licht an der Fernbedienung drücken, Ausgang in der SPS setzen. Taste wieder drücken, Ausgang zurücksetzen.
Ich könnte das auch in der SPS lösen, aber ich würde halt gern wissen, wie das als Script aussieht.
LD M0.0 UN A0.2 S A0.2, 1 R M0.0, 1 LD M0.0 U A0.2 R A0.2, 1 R M0.0, 1
-
Also ich gebe es auf. Mit script bekomme ich es nicht hin.
-
-
Veegiss das. Ist nur das SPS Programm. Damit gehts sofort.
-
Hallo,
das Abrufen der Objekte in den If-Bedingungen ist falsch. Ausserdem ist idDst machmal true und manchmal 0
var idSrc = "hm-rpc.0.OEQ0119854.3.PRESS_SHORT"; var idDst = "s7.0.Outputs.0.Lin_Licht"; var Flag = "s7.0.Markers.0.Flag_Licht"; subscribe ({id: idSrc, val:true}, function(data) { setState(Flag,true); //log(getState(Flag).val); }); on(Flag, function(dp) { // Triggern bei Änderung IF (getState(IdDst.State).val == "0" ); { setState(idDst,true); setState(Flag,false); } IF (getState(IdDst.State).val == "1" ); { setState(idDst,false); setState(Flag,false); } });
Gruß
Pix
PS: Kannst du den Thread Titel noch in Keymatic Fernbedienung mit SPS ändern?
-
Ja ja, die liebe Syntax. Da brauch ich noch ein bisschen.
Das Zweite If könnte man auch durch einfügen von Else im esten ersetzen.
Das bekomme ich auch nicht hin.
Wenn Du mir das noch zeigen könntest, bin ich ein glücklicher Mann
Großen Dank
ToBo
PS: müsste es nicht auch funktionieren, wenn ich bei dem Flag in der Deklaration die Zuordnung zu einem Merker in der SPS weglasse und Flag dann eine interne Variable ist ?
-
Habe Deinen Code gerade getestet und leider kommt eine Mega Fehlermeldung.
- avascript.0 ReferenceError: IF is not defined at Object. (script.js.HM_to_S7.Lin-Licht:12:1) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1325:48) at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:585:48 at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3237:17) at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28) at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28) at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:581:17) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:253:17) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3045:37) at RedisClient. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:93:25)
` > avascript.0 2017-06-21 10:23:00.900 info Stop script script.js.HM_to_S7.Lin-Licht
javascript.0 2017-06-21 10:22:58.334 error at RedisClient. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:93:25)
javascript.0 2017-06-21 10:22:58.334 error at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3045:37)
javascript.0 2017-06-21 10:22:58.334 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:253:17)
javascript.0 2017-06-21 10:22:58.334 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:581:17)
javascript.0 2017-06-21 10:22:58.334 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28)
javascript.0 2017-06-21 10:22:58.334 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28)
javascript.0 2017-06-21 10:22:58.334 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3237:17)
javascript.0 2017-06-21 10:22:58.334 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:585:48
javascript.0 2017-06-21 10:22:58.334 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1325:48)
javascript.0 2017-06-21 10:22:58.334 error at Object. (script.js.HM_to_S7.Lin-Licht:12:1)
javascript.0 2017-06-21 10:22:58.334 error ReferenceError: IF is not defined
javascript.0 2017-06-21 10:22:58.328 error pmessage io.s7.0.Markers.0.Flag_Licht {'val':false,'ack':true,'ts':1498033378325,'q':0,'from':'system.adapter.s7.0','lc':1498033378325} IF is not defined
javascript.0 2017-06-21 10:22:56.830 error at RedisClient. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:93:25)
javascript.0 2017-06-21 10:22:56.830 error at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3045:37)
javascript.0 2017-06-21 10:22:56.830 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:253:17)
javascript.0 2017-06-21 10:22:56.830 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:581:17)
javascript.0 2017-06-21 10:22:56.830 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28)
javascript.0 2017-06-21 10:22:56.830 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3256:28)
javascript.0 2017-06-21 10:22:56.830 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3237:17)
javascript.0 2017-06-21 10:22:56.830 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:585:48
javascript.0 2017-06-21 10:22:56.830 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1325:48)
javascript.0 2017-06-21 10:22:56.830 error at Object. (script.js.HM_to_S7.Lin-Licht:12:1)
javascript.0 2017-06-21 10:22:56.830 error ReferenceError: IF is not defined
javascript.0 2017-06-21 10:22:56.825 error pmessage io.s7.0.Markers.0.Flag_Licht {'val':true,'ack':false,'ts':1498033376821,'q':0,'from':'system.adapter.javascript.0','lc':1498033376821} IF is not defined
javascript.0 2017-06-21 10:22:53.280 info script.js.HM_to_S7.Lin-Licht: registered 2 subscriptions and 0 schedules `
-
JavaScript ist case sensitiv, IF muss klein geschrieben werden…...if
-
Ja ja, die liebe Syntax. Da brauch ich noch ein bisschen.
Das Zweite If könnte man auch durch einfügen von Else im esten ersetzen.
Das bekomme ich auch nicht hin.
Wenn Du mir das noch zeigen könntest, bin ich ein glücklicher Mann `
du meinst den code
IF (getState(IdDst.State).val == "0" ); { setState(idDst,true); setState(Flag,false); } IF (getState(IdDst.State).val == "1" ); { setState(idDst,false); setState(Flag,false); } });
umsetzen in eine elseif
IF (getState(IdDst.State).val == "0" ){ setState(idDst,true); setState(Flag,false); } elseif (getState(IdDst.State).val == "1"){ setState(idDst,false); setState(Flag,false); };
?
-
on(Flag, function(dp) { // Triggern bei Änderung
Soweit ich es verstehe, bedeutet obiger Code, das diese Funktion jedesmal bearbeitet wird, wenn sich der Status der Vaiable Flag ändert
In diesem Fall von 0 –> 1 --> 0
Ich möchte aber nur, dass die Funktion bearbeitet wird, wenn Flag von 0 --> 1 geht.
Geht das auch ?
-
on({id: Flag, val: 1, oldVal: 0, change: 'ne' }, function(dp) { // tue was (kein if mehr nötig) });
oder wenn Flag sowieso nur 0 oder 1 sein kann (und eine Nummer ist und kein String)
on({id: Flag, change: 'gt' }, function(dp) { // Wert größer als alter Wert // tue was (kein if mehr nötig) });
oder klassisch:
on(Flag, function(dp) { // Wert größer als alter Wert if ((dp.state.val =="1") && (dp.oldState.val ==="0")) log('Neuer Wert'); });
steht alles hier: https://github.com/ioBroker/ioBroker.ja ... some-state
Gruß
Pix
-
Super und Danke.
Ich sehe halt viele Scripts, die super vereinfacht geschrieben sind. Auch wenn sie funktionieren, verstehe ich doch mit der kompletten, nicht einfachen Schreibweise eher was da passiert.
Gruss.
ToBo