NEWS
[erledigt] Drwopdown mit Änderung Datenpunkt?
-
ich versuche vergeblich, ein Dropdown einzufügen, welches bei Auswahl im Datenpunkt der Auswahl das aktuelle Datum bzw Date.now() setzt
also Dropdown öffnen, Gerät auswählen und dem Datenpunkt wird akt. Datum gesetzt
Zweck: Batteriewechsel einfach registrieren und Laufzeit 'Nullen' (mit so einem Dropdown könnte man später noch viele andere Dinge vereinfachen)
hat da jemand eine Lösung?
das script im Spoiler erzeugt die Datenpunkte bzw. wertet sie aus, ist aus einem fremden script entstanden und wurde von mir stark abgewandelt, darin unsinniges darf auch gerne bemängelt werden
Nachtrag:
oder behelfsweise würde es auch genügen, eine variable Liste zu haben (welche per script gefüllt wird) und die Einträge anklickbar, bei klick dann Datenpunkt ändern, evtl im script bereits eine Art link dafür zufügen oder ähnliches?
(möglicherweise einfacher zu realisieren?)
! var sensoren=['channel[state.id=.LOWBAT_ALARM]','channel[state.id=.LOW_BAT]','channel[state.id=.batterylow]'];
! //
! function addDeviceCounter() {
! //Total amount of devices found by selector
! var state_total = 'deviceCounter.lowbat.total';
! createState(state_total, 0);
! //List of devices that match condition
! var state_list = 'deviceCounter.lowbat.list';
! createState(state_list, "");
! var state_list2 = 'deviceCounter.lowbat.list2';
! createState(state_list2, "");
! //Number of devices that match condition
! var state_counter = 'deviceCounter.lowbat.leer';
! createState(state_counter, 0);
! var d_count2 = 0;
! var d_list2 = [];
! var d_list3 = [];
! function countDevs2() {
! d_count2 = 0;
! d_list2 = [];
! d_list3 = [];
! for (i = 0; i < sensoren.length; i++) {
! var d2=ea(sensoren__);
! d_count2+=d2[0];
! d_list2=d_list2.concat(d2[1]);
! d_list3=d_list3.concat(d2[2]);
! }
! d_list3.sort();
! log("check lowbat (" + d_count2 + "): " + d_list2);
! setState(state_list, d_list2.join('
'));
! var html="";
! html=html+"";
! for(var i=0;i <d_list3.length;i++){<br>var teile=d_list3__.split(",");
! var num=("0" + (i+1)).slice(-2)
! html=html+"</d_list3.length;i++){<br>";
! }
! html=html+"__
! | Name/Gerät | Batterie | Tage |
| "+num+" "+teile[0]+" | "+teile[1]+" | "+teile[2]+" |
! __";
! //setState(state_list2, d_list3.join('
'));
! setState(state_list2, html);
! setState(state_counter, d_list2.length);
! setState(state_total, d_count2);
! }
! function ea(sensor){
! var d_count = 0;
! var d_list = [];
! var d_list_b = [];
! $(sensor).each(function(id,i) {
! ++d_count;
! var parentChannelId = id.slice(id.lastIndexOf("."));
! var parentDevicelId = id.split(".").slice(0,-2).join(".");
! if (parentDevicelId==="fritzdect.0") {
! parentDevicelId = id.split(".").slice(0,-1).join(".");
! }
! //log("Setting Open: "+parentDevicelId);
! var deviceObject = getObject(parentDevicelId);
! var name=deviceObject.common.name.replace(/ /g, '_');
! if (!'deviceCounter.bat_wechsel.'+name) {
! createState('deviceCounter.bat_wechsel.'+name, Date.now());
! } else if (getState('deviceCounter.bat_wechsel.'+name).val==="") {
! setState('deviceCounter.bat_wechsel.'+name,Date.now());
! }
! var wechsel=getState('deviceCounter.bat_wechsel.'+name).val;
! var oneDay = 2460601000; // hoursminutesseconds*milliseconds
! var diffDays = Math.round (Math.abs(Date.now() - wechsel))/(oneDay);
! var zustand ="ok";
! if(id && getState(id).val && getState(id).val !=="0") {
! d_list.push(deviceObject.common.name);
! zustand ="leer";
! }
! d_list_b.push(deviceObject.common.name+", "+zustand+','+diffDays.toFixed(0));
! });
! return [d_count,d_list,d_list_b];
! }
! //Re-evaluate when a device status changes
! $('channel[state.id=*BAT]').on(function (obj) {
! countDevs2();
! });
! $('channel[state.id=*batterylow]').on(function (obj) {
! countDevs2();
! });
! //Re-evaluate each hour
! schedule("11 */6 * * *", countDevs2);
! //Evaluate for the first time
! countDevs2();
! }
! addDeviceCounter();____ -
habe nun das hier gefunden
viewtopic.php?f=30&t=4483#p43640
und angepastt umgesetzt
dropdown lässt sich passen befüllen, Auswahl funktioniert und wird im anderen Feld angezeigt
wie jedoch kann ich eine Aktion, das setzen eines Datenpunktes direkt oder per JS bewirken?
den teil habe ich nicht verstanden - hoffe es findet sich noch jemand der helfen kann und mag
-
Zeig mal wie dein code bisher aussieht oder ist das oben der aktuelle Stand?
Noch ne kleine Anmerkung wenn du den code in die "Code-Tags" schreibst lässt sich das leichter lesen.
-
auch wenn es dafür unerheblich ist, code angehängt
code für die Reaktion per vis existiert ja nicht - weil ich noch nichts an Datenpunkt oder js übergeben kann
der code oben generiert mir nur die Listen, dropdown kann ich wahlweise mit allen oder leere Batterien befüllen
habe es eben mal mit einem Input-Feld probiert, aber ich kann dieses zwar ebenso aus der Liste füllen aber dann nicht einen Datenpunkt setzen
was mir fehlt ist eigentlich nur, nach Auswahl aus der Liste einen datenpunkt zu setzen (weil ich ja nicht Quelle UND Ziel einstellen kann)
meine Vorstellung: nach Auswahl aus der Liste setze ich Datenpunkt xxx.xx.vis_auswahl
diesen kann ich dann auf Änderung abfragen, code ausführen und leeren
(aus dem gewählten Listeneintrag würde der Datenpunktname extrahiert werden, das ist alles kein Problem)
es fehlt mir also einzig und allein, wenn ich in der dropdown etwas auswähle, diese Auswahl in einen Datenpunkt zu schreiben
edit: Bild angehängt, evtl ist's dann deutlicher? die Auswahl möchte ich in einen Datenpunkt schreiben

`[spoiler] var sensoren=['channel[state.id=*.LOWBAT_ALARM]','channel[state.id=*.LOW_BAT]','channel[state.id=*.batterylow]']; // function addDeviceCounter() { //Total amount of devices found by selector var state_total = 'deviceCounter.lowbat.total'; createState(state_total, 0); var state_vlist = 'deviceCounter.lowbat.vis_list'; createState(state_vlist); //List of devices that match condition var state_list = 'deviceCounter.lowbat.list'; createState(state_list, ""); var state_list2 = 'deviceCounter.lowbat.list2'; createState(state_list2, ""); //Number of devices that match condition var state_counter = 'deviceCounter.lowbat.leer'; createState(state_counter, 0); var d_count2 = 0; var d_list2 = []; var d_list3 = []; var vis_list = ""; function countDevs2() { d_count2 = 0; d_list2 = []; d_list3 = []; vis_list = ""; for (i = 0; i < sensoren.length; i++) { var d2=ea(sensoren[i]); d_count2+=d2[0]; d_list2=d_list2.concat(d2[1]); d_list3=d_list3.concat(d2[2]); } d_list3.sort(); log("check lowbat (" + d_count2 + "): " + d_list2); setState(state_list, d_list2.join(' ')); var html=""; //html=html+"Name/GerätBatterieTage"; for(var i=0;i<d_list3.length;i++){ var/teile="d_list3[i].split(",");" num="("0"" +/(i+1)).slice(-2);/if/(teile[1].replace(/g,/'')/!="=" "ok")/{/vis_list+="num+"" "+teile[0]+"/("+teile[2]+"/tage);";/}/html="html+"<tr">"+num+" "+teile[0]+""+teile[1]+""+teile[2]+""; html+=num+" "+teile[0]+" "+teile[1]+" ("+teile[2]+" Tage);"; } //html=html+""; //setState(state_list2, d_list3.join(' ')); setState(state_list2, html); setState(state_counter, d_list2.length); setState(state_total, d_count2); setState(state_vlist, vis_list); } function ea(sensor){ var d_count = 0; var d_list = []; var d_list_b = []; $(sensor).each(function(id,i) { ++d_count; var parentChannelId = id.slice(id.lastIndexOf(".")); var parentDevicelId = id.split(".").slice(0,-2).join("."); if (parentDevicelId==="fritzdect.0") { parentDevicelId = id.split(".").slice(0,-1).join("."); } //log("Setting Open: "+parentDevicelId); var deviceObject = getObject(parentDevicelId); var name=deviceObject.common.name.replace(/ /g, '_'); if (!'deviceCounter.bat_wechsel.'+name) { createState('deviceCounter.bat_wechsel.'+name, Date.now()); } else if (getState('deviceCounter.bat_wechsel.'+name).val==="") { setState('deviceCounter.bat_wechsel.'+name,Date.now()); } var wechsel=getState('deviceCounter.bat_wechsel.'+name).val; var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds var diffDays = Math.round (Math.abs(Date.now() - wechsel))/(oneDay); var zustand ="ok"; if(id && getState(id).val && getState(id).val !=="0") { d_list.push(deviceObject.common.name); zustand ="leer"; } d_list_b.push(deviceObject.common.name+", "+zustand+','+diffDays.toFixed(0)); }); return [d_count,d_list,d_list_b]; } //Re-evaluate when a device status changes $('channel[state.id=*BAT]').on(function (obj) { countDevs2(); }); $('channel[state.id=*batterylow]').on(function (obj) { countDevs2(); }); //Re-evaluate each hour schedule("11 */6 * * *", countDevs2); //Evaluate for the first time countDevs2(); } addDeviceCounter();</d_list3.length;i++){>`[/i][/i][/spoiler] ```~~
-
nicht das ich es merkwürdig finde, wenn die gesamte Hilfe aus 'zeig mal deinen code' besteht
einige Stunden try and error bringen auch Ergebnisse, sicher wollte man mir nur den Lerneffekt vertiefen
-
nicht das ich es merkwürdig finde, wenn die gesamte Hilfe aus 'zeig mal deinen code' besteht
einige Stunden try and error bringen auch Ergebnisse, sicher wollte man mir nur den Lerneffekt vertiefen
`
Zum einen ist es für mich nicht merkwürdig wenn man in einem Forum erstmal zeigen soll was man selbst schon bewerkstelligt hat.
Ich persönlich finde es auch nicht merkwürdig wenn man nicht sofort eine Antwort bekommt, da es ja Leute geben soll die sich nicht den ganzen Tag hier tummeln um auf Fragen/Probleme zu warten die man dann unentgeldlich versucht zu lösen/unterstützen.
Aber da mögen die Meinungen auseinander gehen.
-
die Problembeschreibung und der (dazu nicht benötigte) Code stand im ersten Post vom 6.
und zum Problem hatte ich vorher exakt <u>nichts</u> 'schon gemacht', weil ich keinen Ansatz hatte
wenn die Anfrage bereits so weit nach hinten verschoben war wie sie war (hinter Antworten/Reaktionen - teils mit neuen Fragen), hat das mit 'grad niemand da' auch nichts zu tun, übrigens hat dieses Forum eine 'wer ist online'-Anzeige …
-
die Problembeschreibung und der (dazu nicht benötigte) Code stand im ersten Post vom 6.
und zum Problem hatte ich vorher exakt <u>nichts</u> 'schon gemacht', weil ich keinen Ansatz hatte
wenn die Anfrage bereits so weit nach hinten verschoben war wie sie war (hinter Antworten/Reaktionen - teils mit neuen Fragen), hat das mit 'grad niemand da' auch nichts zu tun, übrigens hat dieses Forum eine 'wer ist online'-Anzeige … `
Um es auch dir verständlich zu erklären:
Ich lese wenn ich Zeit und LUST habe öfter ältere Sachen (auch älter als mehrere Tage) durch um evtl. helfen oder selbst etwas lernen zu können.
Deinen Post vom 6ten habe ich am 9ten gelesen und schrieb über mein Handy nach einem kurzen überfliegen "zeig mal deinen Code".
Als wir dann am Nachmittag wieder zu Hause waren (wo auch mein Pc steht) und ich mir das Ganze nochmals in Ruhe ansehen wollte um, sofern es mir mit meinem Wissen möglich ist zu Unterstützen hattest du es anscheinend schon gelöst was mich für dich freut!
Ich weiß sehr wohl dass man wenn ein Problem oder eine Frage auftaucht am liebsten sofort Unterstützung bzw. eine Lösung möchte doch das bekommt man leider in Foren nicht immer, wobei ich sagen würde hier noch öfter als in Anderen.
-
vorab: extra dankeschön für das Verständnis und den nicht angreifenden Text, ist nicht selbstverständlich (zumal ich ja mehr oder weniger deutlich am maulen war)
und es war nicht auf dich persönlich bezogen - sehr wahrscheinlich ist es auch hier wie anderswo, die Masse liest, lässt sich helfen und schweigt ansonsten (leider auch oft die welche genau zu einer ähnlichen Frage schon Hilfe bekamen)
und für den kleinen Teil wissender nehmen wir einfach an, für die wars grad auch ungünstig
werde in Zukunft deutlich mehr Geduld an den tag legen in der Hoffnung, das einer der wenigen sich meiner annimmt
ist halt ungeschickt, wenn man nichtmal weiß ob es denn überhaupt geht und ein Projekt auf Eis legen muss
achja, ich habe es gelöst indem ich einen Button dazu gestzt habe welcher mir einen dafür extra Datenpunkt mit dem Auswahlfeld füllt, darauf spricht ein script an
den Text zerlege ich, es bleibt der reine Name übrig mit welchem ich den betroffenen Datenpunkt anspreche und mit neuem Datum setze, dann lösche ich den Inhalt des extra Datenpunktes wieder
(also Auswahl füllt das obere Feld, daneben Button zum Datenpunkt setzen, script reagiert darauf)