NEWS
[Gelöst] "Raum" von einem Datenpunkt mit Blockly zuordnen
-
Ist es möglich mit Blockly den "Raum" eines Datenpunktes zu ändern?
Für die Zimmerreinigung mit dem Roborock S7 möchte ich so die zu reinigende Räume eintragen. -
@kusi
Man muss sich dazu eine javascript-Funktion basteln.
getObject(id,true) -> setObject mit neuem Room
-
@kusi sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
die zu reinigende Räume eintragen.
Wenn Du dort den Raum setzt, dann fügst Du den State nur zu den Aufzählungen hinzu. Ich glaube nicht, dass der Roborock Adapter die Raumliste nutzt?!
Zumal der Name des Zustandes ja eher vermuten lässt, dass man dort nur eine Option aktiviert (ja/nein). Ist ja boolean.Ansonsten kann man z.B. so ein State (Zustand) zu einem Enum (Aufzählung) hinzufügen:
-
@haus-automatisierung sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
Wenn Du dort den Raum setzt, dann fügst Du den State nur zu den Aufzählungen hinzu. Ich glaube nicht, dass der Roborock Adapter die Raumliste nutzt?!
Doch, ich habe es getestet.
Fügt man bei "Raum" die zu reinigenden Räume hinzu und setzt dann denn State auf "true", dann beginnt die Reinigung der ausgewählten Räumen. -
@mcu sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
getObject(id,true) -> setObject mit neuem Room
Kannst du das eventuell etwas erläutern?
-
@kusi Schau auf den Link von @haus-automatisierung , dort wird es gezeigt. Es sollte dort noch abgefragt, ob die ID schon zugeordnet wurde. Nutzt man die Funktion öfter, wird sonst immer wieder der DP angehängt.
-
@mcu Guter Hinweis - habe ich im Script hinzugefügt
-
@mcu @haus-automatisierung
Vielen Dank für eure Antworten.
Ich verstehe das Skript zuwenig, aber ich glaube auch, dass ich es vielleicht nicht ganz deutlich erklärt habe.Ich muss einem fixen Datenpunkt (nennen wir ihn "clean room") die zu reinigenden Räume per "Raum" zuordnen.
Will ich z.B. Wohnzimmer und Esszimmer reinigen, dann ordne ich dem Datenpunkt "clean room" die 2 Räume "Wohnzimmer" und "Esszimmer" zu, danach setze ich den State vom Datenpunkt "clean room" auf true.
Die Räume ändern sich immer wieder, beziehungsweise sollte nach einer erfolgten Reinigung diese Zuordnung auch wieder aufgeboben werden.Ich muss dabei KEINE Object ID's oder dergleichen schreiben, nur den/die Raumname/-n.
Dies kann gerne manuell per Blockly über die Textbausteine geschehen. -
@kusi sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
Ich muss dabei KEINE Object ID's oder dergleichen schreiben, nur den/die Raumname/-n.
Du weißt schon, dass ALLES im ioBroker ein Objekt ist?
-
@haus-automatisierung sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
Du weißt schon, dass ALLES im ioBroker ein Objekt ist?
Nein, das wusste ich nicht. Danke
-
@haus-automatisierung sagte in "Raum" von einem Datenpunkt mit Blockly zuordnen:
@mcu Guter Hinweis - habe ich im Script hinzugefügt
Beim zweiten Anlauf hat es geklappt. Hatte die Funktion nicht "gestartet".
Die Variablen konnte ich auch einwandfrei einbauen.
Nun frage ich mich, wie lässt sich der Raum wieder entfernen, oder noch besser alle Räume auf einmal? -
@kusi z.B.
function delAllEnum(objId){ if (existsObject(objId)) { const idObj = getObject(objId,true); let enumArr = idObj.enumIds; if(enumArr.length>0){ for(let i=0;i<enumArr.length;i++){ let enumObj = getObject(enumArr[i]); const index = enumObj.common.members.indexOf(objId); if (index > -1) { enumObj.common.members.splice(index, 1); extendObject(enumArr[i], { common: { members: enumObj.common.members } }); } } }else{ log(`Object with ID ${objId} have no Enum`,'warn'); } } else { throw new Error(`Object with ID ${objId} does not exist`); } }
-
@mcu Herzlichen Dank, es klappt. So sieht nun der Teil aus für das Eintragen des Raumes und Löschen vom Raum.
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="m5[!xu|Wi0|iUPD0]$(n">enumId</variable> <variable id="bew6)lW6-(k7ff;qA4o=">objId</variable> <variable id="~ij?Yx^iTdvm/69t5MMk">Raum</variable> </variables> <block type="comment" id="^vx4q,|Hp?5}y[]{%oI*" x="538" y="-213"> <field name="COMMENT">Datenpunkt setzen</field> <next> <block type="variables_set" id="aGTG1Sk.woJi$Bn)JC?G"> <field name="VAR" id="bew6)lW6-(k7ff;qA4o=">objId</field> <value name="VALUE"> <block type="field_oid" id="SEniN^*TqD%`9wriO1-G"> <field name="oid">0_userdata.0.test</field> </block> </value> </block> </next> </block> <block type="on" id="IB$_f2$p}D,k`h8bD)+d" x="188" y="-87"> <field name="OID">0_userdata.0.Roborock_S7.Reinigung_starten.Räume.Ankleidezimmer</field> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id="Sp!m7mrW#r*H71cM*:ok"> <mutation name="Raumname"> <arg name="Raum"></arg> </mutation> <value name="ARG0"> <block type="text" id="eKxdbi_aTq[w!k0C3I~w"> <field name="TEXT">Ankleidezimmer</field> </block> </value> </block> </statement> </block> <block type="procedures_defnoreturn" id="8nsaO;9MQ.;T8wDeK=}z" x="188" y="113"> <mutation> <arg name="Raum" varid="~ij?Yx^iTdvm/69t5MMk"></arg> </mutation> <field name="NAME">Raumname</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="procedures_callcustomnoreturn" id="j3=]hsERc$+:wG-[n}*X"> <mutation name="Raum eintragen"> <arg name="enumId"></arg> <arg name="objId"></arg> </mutation> <value name="ARG0"> <block type="text_join" id="40dMHfUzYC2hFANB}0Bq"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="PX#i`.J.^04x5lZ~.aje"> <field name="TEXT">enum.rooms.</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="3tp[McyNX%VXBk=AaDB="> <field name="VAR" id="~ij?Yx^iTdvm/69t5MMk">Raum</field> </block> </value> </block> </value> <value name="ARG1"> <block type="variables_get" id="4hC{Mhp;GdUXMb=2eMcU"> <field name="VAR" id="bew6)lW6-(k7ff;qA4o=">objId</field> </block> </value> </block> </statement> </block> <block type="on" id="L%ST#I.PnkvpTL#~v;cf" x="812" y="113"> <field name="OID">0_userdata.0.Roborock_S7.Reinigung_starten.Raum_löschen</field> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="procedures_callcustomnoreturn" id="O]i(NdwAZ]EOTm^fG*6J"> <mutation name="Raum löschen"> <arg name="objId"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="D(W1E=C~n]=1pC-]]1.,"> <field name="VAR" id="bew6)lW6-(k7ff;qA4o=">objId</field> </block> </value> </block> </statement> </block> <block type="procedures_defcustomnoreturn" id="}HM6fh4VbzlJ6Y-~?QB*" x="188" y="313"> <mutation statements="false"> <arg name="enumId" varid="m5[!xu|Wi0|iUPD0]$(n"></arg> <arg name="objId" varid="bew6)lW6-(k7ff;qA4o="></arg> </mutation> <field name="NAME">Raum eintragen</field> <field name="SCRIPT">aWYgKGV4aXN0c09iamVjdChvYmpJZCkpIHsNCiAgICBpZiAoZXhpc3RzT2JqZWN0KGVudW1JZCkpIHsNCiAgICAgICAgY29uc3QgZW51bU9iaiA9IGdldE9iamVjdChlbnVtSWQpOw0KDQogICAgICAgIGlmIChlbnVtT2JqLnR5cGUgPT09ICdlbnVtJykgew0KICAgICAgICAgICAgaWYgKCFlbnVtT2JqLmNvbW1vbi5tZW1iZXJzLmluY2x1ZGVzKG9iaklkKSkgew0KICAgICAgICAgICAgICAgIGVudW1PYmouY29tbW9uLm1lbWJlcnMucHVzaChvYmpJZCk7DQogICAgICAgICAgICAgICAgc2V0T2JqZWN0KGVudW1JZCwgZW51bU9iaik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYXJnZXQgb2JqZWN0IHdpdGggSUQgJHtlbnVtSWR9IGlzIG5vdCBhbiBlbnVtYCk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudW0gd2l0aCBJRCAke2VudW1JZH0gZG9lcyBub3QgZXhpc3RgKTsNCiAgICB9DQp9IGVsc2Ugew0KICAgIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IHdpdGggSUQgJHtvYmpJZH0gZG9lcyBub3QgZXhpc3RgKTsNCn0NCg==</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> <block type="procedures_defcustomnoreturn" id="9f.]bC!e2ZsV2r}U3iJn" x="812" y="313"> <mutation statements="false"> <arg name="objId" varid="bew6)lW6-(k7ff;qA4o="></arg> </mutation> <field name="NAME">Raum löschen</field> <field name="SCRIPT">aWYgKGV4aXN0c09iamVjdChvYmpJZCkpIHsgIA0KICAgIGNvbnN0IGlkT2JqID0gZ2V0T2JqZWN0KG9iaklkLHRydWUpOw0KICAgIGxldCBlbnVtQXJyID0gaWRPYmouZW51bUlkczsNCiAgICBpZihlbnVtQXJyLmxlbmd0aD4wKXsNCiAgICAgICAgZm9yKGxldCBpPTA7aTxlbnVtQXJyLmxlbmd0aDtpKyspew0KICAgICAgICAgICAgbGV0IGVudW1PYmogPSBnZXRPYmplY3QoZW51bUFycltpXSk7DQogICAgICAgICAgICBjb25zdCBpbmRleCA9IGVudW1PYmouY29tbW9uLm1lbWJlcnMuaW5kZXhPZihvYmpJZCk7DQogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgeyANCiAgICAgICAgICAgICAgICBlbnVtT2JqLmNvbW1vbi5tZW1iZXJzLnNwbGljZShpbmRleCwgMSk7DQogICAgICAgICAgICAgICAgZXh0ZW5kT2JqZWN0KGVudW1BcnJbaV0sIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbjogew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnM6IGVudW1PYmouY29tbW9uLm1lbWJlcnMNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9ZWxzZXsNCiAgICAgICAgbG9nKGBPYmplY3Qgd2l0aCBJRCAke29iaklkfSBoYXZlIG5vIEVudW1gLCd3YXJuJyk7DQogICAgfQ0KfSBlbHNlIHsNCiAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCB3aXRoIElEICR7b2JqSWR9IGRvZXMgbm90IGV4aXN0YCk7DQp9</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> </xml>
-
@mcu Herzlichen Dank nochmals für eure Hilfe.
-
Ich hab den Thread jetzt 2 mal gelesen und verstehe noch nicht ganz wo für das ganze.....
Warum werden nicht einfach die gewünschten Räume auf true gesetzt und fertig? Los geht die Reinigung.
So mache ich es.
(Zumindest im Roborock Adapter) -
@david-g sagte in [Gelöst] "Raum" von einem Datenpunkt mit Blockly zuordnen:
Warum werden nicht einfach die gewünschten Räume auf true gesetzt und fertig?
Habe ich zuerst versucht.
Zumindest bei mir ist aber der Staubsauger dann nach jedem Raum zurück auf die Ladestation gefahren und hat den Mopp gereinigt.Starte ich mit obigem Blockly die Reinigung, dann reinigt der Staubsauger so lange, bis er bis zur vorgegebenen Zeit auf die Ladestation zur Moppreinigung fährt.