NEWS
.VIS Sonoff/MQTT Wechselschaltung
-
Hallo,
ich bin neu in ioBroker und fummel mich seit ca 1 Woche durch das ganze System und erstelle Test Views
Soweit habe ich die grundlegenden dinge verstanden.
Aber ich habe da noch ein Ding, bei dem ich nicht weiter komme
Ich möchte eine art "Wechselschaltung" realisieren.
Ich habe ein Sonoff pow mit Tasmota. Den habe ich in VIS als Lampe/Blub .````
/Garten/Schuppen/Pumpe/cmnd/POWERNun möchte ich aber über einen Externen Taster mit LED( wird über einen ESP8266 mit Tasmota) in MQTT übertragen```` /Garten/Laube/Pumpe/cmnd/POWER ````. Wenn ich jetzt den Taster betätige soll mein Sonoff geschaltet werden und die LED im Taster soll den aktuellen Status von```` /Garten/Schuppen/Pumpe/stat/POWER ````anzeigen. Kann ich das in VIS realisieren, oder muss ich das irgendwie anders machen? Geht das überhaupt?
-
Geht es dir dabei nur um die Visualisierung im VIS oder soll auch die "echte" LED vom Schalter an/aus gemacht werden?
So, wie ich dich verstanden habe, brauchst du erstmal ein Script, der bei Änderung des Schalter Zustandes dann deinen Pow schaltet.
Ungefähr so:
on({id:Schalter.Power, change:"ne"}, function(obj){
setState(Pow.Power, obj.state.val);
})
Wenn du dann noch deine LED in Tasmota steuern willst, weiss ich gerade nicht, wie du die ansteuern würdest, da ich mal annehme, dass das eine eigenentwicklung ist. Da kommt es darauf an, wie die auch im ioBroker ankommt.
gruss
Dirk
-
Danke schon mal.
Ja so in der Art. Mit dem Code bzw wofür der ist, kann ich noch nichts anfangen, habe bis jetzt nur die Plug&Play Verwaltung von VIS genutzt. Da lese ich mal rein.
Also ich habe ioBroker auf einem Raspberry laufen.
Das ganze, soll wenn's mal fertig ist, in meinem Schrebergarten.
Der Sonoff POW ist jetzt erst mal das Testobjekt, habe da noch einige weitere, aber im Endeffekt haben später alle die selbe Konfiguration.
Der POW soll sowohl über VIS als auch über einem Hardwaretaster mit LED geschaltet werden.
Aktuell wird der POW über VIS also BLUB on/off geschaltet. "Object ID: mqtt.0.Garten.Schuppen.Pumpe.cmnd.power"
Als Bild habe ich ein Transparentes PNG genommen. Im Hintergrund ist ein weitere BULB "Object ID: mqtt.0.Garten.Schuppen.Pumpe.stat.POWER" um den Life Staus anzuzeigen der direkt über MQTT vom POW kommt.
Jetzt möchte ich mit dem Hardware Taster, der an einem ESP8266 hängt, ebenfalls den POW schalten und die LED, ebenfalls am ESP8266 soll den Lifestatus anzeigen vom POW.
Auf dem ESP läuft auch mit Tasmota als "18 Generic" dort kann ich die IO ja frei konfigurieren. Also noch offen, so wie es am einfachsten ist, sowas umzusetzen. Vorgestellt hatte ich mir, das beim betätigen des Taster " /Garten/Laube/Pumpe/stat/POWER" der POW einen "Toggle" bekommt. Zusätzlich natürlich auch aus VIS.
Die LED "/Garten/Laube/Pumpe/cmnd/POWER" soll hat den Staus vom POW Anzeigen.
*Die LED/Taster kommen ganz normal über MQTT an. Genau wie ein Sonoff Gerät.
Also eigentlich sollen der POW, der LED Taster und .VIS alle das selbe machen/anzeigen.
Ich denke mal, das es wohl gar nicht zu kompliziert ist, aber irgendwie stehe ich da grad aufm Schlauch ^^
-
Also im Prinzip hast du 2 Parts.
1. Du musst deine Hardware synchron halten, das kannst du mit den Script machen:
on({"mqtt.0.Garten.Laube.Pumpe.stat.power", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.power", obj.state.val); }) on({"mqtt.0.Garten.Schuppen.Pumpe.cmnd.power", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Laube.Pumpe.cmnd.power", obj.state.val); })
Im vis hast du ja alles schon gemacht, so wie ich dich verstanden habe.
-
Okay, prinzipiell sollte das passen, soweit ich das verstehe.
Und den Status für die LED frage ich nicht vom POW ab, sondern das ergibt sich, weil die 2 Geräte, POW und Esp8266 synchronisiert sind. Werde ich heute abend mal testen. Danke
-
Der Code geht so schon mal nicht, bzw es passiert nichts. Die einzelne Geräte laufen zwar unabhängig von einander, aber werden nicht Synchronisiert.
Ich habe den Code , meinen Geräten in MQTT angepasst.
on({"mqtt.0.Garten.Laube.Schalter.stat.POWER1", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); }) on({"mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); })
Ich habe mal die Geräteliste aus MQTT mit angehängt.
Muss der Code in VIS oder ioBroker Skripte? Geht jedenfalls beides nicht. Es wird mir auch ein Fehler angezeigt, aber damit kann ich nichts anfangen.
13280_script.png
13280_mqtt.png -
War mein Fehler, hatte beim kopieren die id: mit weggemacht
on({id:"mqtt.0.Garten.Laube.Schalter.stat.POWER1", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); }) on({id:"mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); })
Als Script ist das schon richtig
-
Ok der Fehler ist weg, geht aber trotzdem nicht :?
Ist es denn korrekt, das im oberen Block xxx-stat abgefragt wird und dann cmnd geschrieben und im unteren Block cmnd gelesen und cmnd geschrieben wird?
Wenn Laube sich ändert, soll Schuppen mit dem Staus geschrieben werden
Wenn Schuppen sich ändert, soll Laube mit dem Staus geschrieben werden
Oder ist das so nicht richtig?
Java ist neu für mich :roll:
Ich habe es auch schon geändert, passiert aber nicht weiter
Oder muss ich irgendwo noch grundlegend was ändern?
-
Du musst dir natürlich deine richtigen datenpunkte raussuchen. Beobachte mal die admin Oberfläche, da musst das natürlich auch funktionieren. Also wenn du in der Oberfläche den Wert änderst, geht die Lampe dann an? Verändert sich der richtige wert dann auch in der Oberfläche?
Das Script (Ist übrigens JavaScript und nicht java) wacht halt über einen Wert und immer, wenn der sich ändert, wird der innere Block aufgerufen. Dort wird dann entsprechend der andere wert gesetzt. In obj.stste.val ist halt true/fade oder 0/1. Es müssen natürlich beide die selben Werte haben. Wenn nicht musst du dann ggg abfragen:
If (obi.state.val === true )
setState(… , 1);
else
setState(... , 0);
Das kannst du alles in der Oberfläche ablesen, wenn du den Wert editieren willst, da steht dann 0 oder fade oder Off drin.
Schreibe hier mit Handy, ist nen bisschen mühsam
-
Okay, verstehe (ein bisschen mehr als vorher) :lol:
Alles klar, aber der Einfachheitshalber ich habe mir das mal in MQTT.FX geloggt. Dort ist mir aufgefallen, das die "cmnd" mit 1 und 0 kommen, und "stat" mit ON und OFF angegeben werden.
on({id:"mqtt.0.Garten.Laube.Schalter.stat.POWER1", change:"ne"}, function(obj){ // setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); If (obj.state.val == ON ); setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", 1); "else"; setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", 0); }); on({id:"mqtt.0.Garten.Schuppen.Pumpe.stat.POWER", change:"ne"}, function(obj){ // setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); If (obj.state.val == ON ); setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", 1); "else"; setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", 0); });
Ich habe es jetzt so probiert, das war für mich am logistischsten, aber geht nicht.
Ich habe aber mit MQTT.FX mal bisschen probiert, wenn ich "true", "false", "0", "1", "ON", "OFF", "on", "off" an cmnd sende, geht's. Also ist es eigentlich egal, was da kommt. die Dinger schalten.
-
Interessant, wie du Anführungszeichen setzt..
on({id:"mqtt.0.Garten.Laube.Schalter.stat.POWER1", change:"ne"}, function(obj){ // setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); If (obj.state.val == "ON" ); setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", 1); else setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", 0); }); on({id:"mqtt.0.Garten.Schuppen.Pumpe.stat.POWER", change:"ne"}, function(obj){ // setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); If (obj.state.val == "ON" ); setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", 1); else setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", 0); });
Du kannst Mal die hilfsausgaben aktivieren und dann Mall das Log beobachten, ob da überhaupt was passiert. Hast du das Script such aktiviert?
-
Das mit den "" wusste ich nicht.
bei den else muss ich auch welche setzten, sonnst meckert das Script. also "else";
Im Log passiert nicht. Hier mal ein Script neustart mit anschließenden Befehlsabgaben:
javascript.0 2018-12-22 21:57:06.124 info received all objects javascript.0 2018-12-22 21:57:04.651 info received all states javascript.0 2018-12-22 21:57:04.110 info requesting all objects javascript.0 2018-12-22 21:57:04.110 info requesting all states javascript.0 2018-12-22 21:57:04.110 info starting. Version 3.6.4 in /opt/iobroker/node_modules/iobroker.javascript, node: v8.14.0 host.ioBroker-RasPi 2018-12-22 21:57:00.691 info instance system.adapter.javascript.0 started with pid 10167 host.ioBroker-RasPi 2018-12-22 21:56:58.210 info instance system.adapter.javascript.0 terminated with code 0 (OK) host.ioBroker-RasPi 2018-12-22 21:56:58.162 info stopInstance system.adapter.javascript.0 killing pid 10052 host.ioBroker-RasPi 2018-12-22 21:56:58.161 info stopInstance system.adapter.javascript.0 host.ioBroker-RasPi 2018-12-22 21:56:58.160 info object change system.adapter.javascript.0
Sieht glaube ich soweit gut aus, aber halt keine Aktionen von den Geräten.
Und ja, das Script ist aktiv.
13280_script-aktiv.png -
Da ist das Problem, bei "global" gehören die nicht rein.
Leg bitte einen neuen Ordner an, oder verschiebe es einfach raus aus "global"!
Enrico
-
Und ich sehr gerade noch, dass du die ; hinter if wegmachen musst
-
Danke für den Tip, jetzt passiert auch was. Zwar nicht was es soll, aber immerhin Fehler :)…..
EDIT: die If waren mit großem I, habs auf if geändert, jetzt passiert auch was.
Zwar nicht das gewünschte Ergebnis, aber immerhin.
Wenn ich jetzt schalte, gehen der POW und die Taster LED kurz an und gleich wieder aus.
22:30:35.487 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:5:1) 22:30:35.488 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:7:1) 22:30:35.555 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:15:1) 22:30:35.556 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:17:1) 22:30:35.595 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:17:1) 22:30:35.636 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:7:1) 22:30:37.509 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:5:1) 22:30:37.509 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:7:1) 22:30:37.535 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:15:1) 22:30:37.536 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:17:1) 22:30:37.569 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:7:1) 22:30:37.584 [warn] javascript.0 at Object. (script.js.Garten.Scripte.Skript1:17:1)
Was sagt mir das?
Skript 1, Zeile 7 , 1 Fehler?
-
In Script1 in Zeile 7, Spalte 1 ist ein warnung, zeigt er dir die im Editor auch an?
Ich bin mir nicht sicher, ob das mit cmnd und stat so richtig ist. Also wahrscheinlich musst du immer nur auf cmnd gehen
-
Nein ein Fehler wird mir im Editor nicht angezeigt.
Ich werde es mal probieren.
Jetzt habe ich meinen ESP8266 gegrillt oder so. Hatte durch probieren eine Schleife gebaut….
An, Aus, An, Aus....... jetzt macht er nichts mehr. Werde morgen noch mal neu Flashen, oder einen neuen nehmen.
Jetzt kann es ja aber nur noch ein Schönheitsfehler sein, oder so ... Ich probiere mal, und werde dann berichten. Grundlegend war der Ordner "global" ja schuld, das überhaupt nichts passiert ist.
-
Also ich kenne mich mit dem mqtt Adapter nicht so aus, da ich in den sonoff Adapter (müsste eigentlich tasmota adapter heissen) nutzte.
Da habe ich nur Power. Ich vermute mal, dass da zear auch stat Meldungen kommen, die werden dann aber in Power verarbeitet. Also in Power wird immer angezeigt, ob das Ding gerade an ist oder nicht. Und wenn du über setState() den Status von Power veränderst, wird das zum Gerät geschickt und wenn das Gerät dann per state zurücksendet, das power on ist, wird das auch in Power in ioBroker gespeichert. So habe ich zumindest das Attribut "ack" verstanden.
Wenn das so ist, dann müsstest du immer nur über cmnd gehen:
on({id:"mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); }) on({id:"mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); })
Aber wie gesagt, ich weiss nicht wie der Adapter da gestrickt ist…
gruss
Dirk
-
Super vielen dank.
Es haben noch Semikolons am ende des Script gefehlt.
Und es muss "stat" abgefragt werden um um "cmnd" zu setzten, aber so gehts jetzt.
Mein ESP8266 läuft jetzt wieder nach dem neuem Flashen. Also nicht kaputt. Was auch immer damit los war gestern.
on({id:"mqtt.0.Garten.Laube.Schalter.stat.POWER1", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Schuppen.Pumpe.cmnd.POWER", obj.state.val); }); on({id:"mqtt.0.Garten.Schuppen.Pumpe.stat.POWER", change:"ne"}, function(obj){ setState("mqtt.0.Garten.Laube.Schalter.cmnd.POWER1", obj.state.val); });
Aber jetzt läuft es.
Den Sonoff Adapter werde ich mir mal angucken ( der ESP8266 kann ja auch als Sonoff 4CH laufen) , wobei ich mit dem MQTT Adapter soweit zufrieden bin.
Jedenfalls danke für deine Hilfe und ich habe wieder, einiges dazu gelernt.
-
Jetzt habe ich eben noch gesehen, das bei jeden Tastendruck , Logeinträge erstellt werden.
javascript.0 2018-12-23 22:26:08.184 error at Object. <anonymous>(null.Skript2:15:5) javascript.0 2018-12-23 22:26:08.183 error Error in callback: ReferenceError: If is not defined javascript.0 2018-12-23 22:26:08.183 error at Object. <anonymous>(null.Skript1:15:5) javascript.0 2018-12-23 22:26:08.182 error Error in callback: ReferenceError: If is not defined javascript.0 2018-12-23 22:26:08.053 error at Object. <anonymous>(null.Skript2:5:1) javascript.0 2018-12-23 22:26:08.052 error Error in callback: ReferenceError: If is not defined javascript.0 2018-12-23 22:26:08.052 error at Object. <anonymous>(null.Skript1:5:1) javascript.0 2018-12-23 22:26:08.051 error Error in callback: ReferenceError: If is not defined</anonymous></anonymous></anonymous></anonymous>
Ich habe aber nur ein Skript am laufen, das nennt sich "Sync-Pumpe" . Laut Log, wie ich es verstehe, wird aber von Skript 1 und Skript 2 gesprochen.
Hast du davon Ahnung?