Skip to content

ioBroker Allgemein

29.7k Topics 437.6k Posts
Integrationtsplattform für IoT

NEWS

  • Adapter smartgarden Fehler 403

    33
    0 Votes
    33 Posts
    7k Views
    B
    @reutli Vielen Dank für Deine Antwort. Über den Brücken- und Feiertag bin war ich abwesend. Guess what - die Daten kommen einfach wieder. Ich habe nichts verstellt. Alles blieb so und der 403 ist gone. Komischer Sache. Ich behalte das im Blick.
  • 0 Votes
    48 Posts
    8k Views
    Thomas BraunT
    @homoran sagte in [gelöst] ioBroker Wiederherstellung mit Backitup: Selbst wenn man bedenkt, dass sie von 2019 ist. Hab ich erst gesehen, als ich es schon geschrieben hatte. Wollte es aber auch nicht mehr redigieren.
  • Anleitung Zigbee2MQTT Einrichtung im ioBroker

    Moved
    28
    0 Votes
    28 Posts
    15k Views
    ?
    @arteck [image: 1696404780163-22c55b12-7e09-442a-8d11-b0d4e08fbf67-image.png] [image: 1696404801825-dcc220cc-f784-4502-a631-20e414714e97-image.png] [image: 1696404852949-b77244c3-d440-4d1f-946f-c173171a3d62-image.png] [image: 1696404904577-098ef72b-e1dd-4f98-8c50-d5b2d443bb6d-image.png] ezsp dürfte auch nicht gehen, ich habe hier ja die PRO-Ausführung, nicht die normale. https://zigbee.blakadder.com/Sonoff_ZBBridge.html [image: 1696408041870-6d5f4741-c15f-46aa-96e1-3277b7464528-image.png]
  • Waschmaschine Kosten pro Waschgang

    2
    0 Votes
    2 Posts
    268 Views
    HomoranH
    @cynric10 sagte in Waschmaschine Kosten pro Waschgang: Mir fehlt hier etwas der Ansatz wo und wie ich das machen könnte. [image: 1696403130681-screenshot_20231004-090210_firefox.jpg]
  • Kalender von Website auslesen

    parser website auslesen kalender ical adapter
    28
    0 Votes
    28 Posts
    3k Views
    liv-in-skyL
    @andrenaether ich glaube, ich habe den fehler gefunden - tritt erst auf, wenn die 2te anlage auch daten enthält - sieht im google-cal wieder so aus: [image: 1696394814180-image-115.png] die telegram-sache hat ja eh funktioniert: [image: 1696394882294-image-116.png] kopiere diesen teil bei dir ab zeile 14 (also dein setting darüber im script behalten) mal rein mache vorher eine kopie des jetzigen scriptes - zur sicherheit diese änderung gilt nur für den innenbereich (halle) - der andere bereich braucht uch noch andere änderungen !!!!! [image: 1696395305948-image-117.png] teil-script für import - nur innenbereich script async function doit(){ theJson=[]; myCalArr=[]; myCalArrTomorrow=[]; myCalArrTomorrowAlarm=[]; countAlarm=0; await getData(); //log(gesucht[0]) //log(String(gesucht.length)) for(let i=0;i<gesucht.length;i++){ let mytime=gesucht[i].replace(/.*new Date\((.*?)\).*/,"$1").split(","); let theDauer=gesucht[i].replace(/.*new Date\(.*?\)\, (.*?)\,.*/,"$1").replace(/00000/,""); let myDauer=getDauer(theDauer) let mydatum=mytime[2]+"."+String(Number(mytime[1])+1)+"."+mytime[0]; let myzeit; let theOrt=String(gesucht[i].replace(/.*new Date\(.*?\)\, .*?\, \[\'(.)\'\].*/,"$1")); //log("ORT - "+theOrt) let todayDay=formatDate(getDateObject((new Date().getTime())), "T.M.JJJJ"); // log(mydatum+ "---" + theDauer+ "---" + myDauer) mytime.length==4 ? myzeit=mytime[3]+":"+"00" : myzeit=mytime[3]+":"+mytime[4]; //let mydauer=Number(gesucht[i].replace(/.*new Date\(.*?\)\, (.*?)\,.*/,"$1"))/100000; //log(mydauer) theJson.push({ "zeit":myzeit, "datum":mydatum, "ereignis":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "), "dauer":getDauer(theDauer) }) //if (i<5){ myCalArr.push({ "start":mydatum+" "+ myzeit, "end":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)), "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," "), "description":"from IOB Script" }) if(todayDay===mydatum && theOrt == "1" ){ //log(todayDay+" - "+theOrt) myCalArrTomorrow.push({ "start":mydatum+" "+ myzeit, "end":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)), "summary":gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "), "description":"from IOB Script" }) if (countAlarm==0){ // einmal bei alarm ersten werte ins array myCalArrTomorrowAlarm.push({ "start":mydatum+" "+ subtract15MinutesFromTime(myzeit,15), "end":mydatum+" "+ subtract15MinutesFromTime(myzeit,10), "summary":"ALARM:"+gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "), "description":"from IOB Script" }) } countAlarm ++; let mytimeAnfangNext; if(i+1<gesucht.length){ mytimeAnfangNext=gesucht[i+1].replace(/.*new Date\((.*?)\).*/,"$1").split(",");} else { mytimeAnfangNext=gesucht[i].replace(/.*new Date\((.*?)\).*/,"$1").split(",");} let myzeitAnfangNext; mytimeAnfangNext.length==4 ? myzeitAnfangNext=mytimeAnfangNext[3]+":"+"00" : myzeitAnfangNext=mytimeAnfangNext[3]+":"+mytimeAnfangNext[4]; // log(myzeitAnfangNext) // log(add15MinutesToTime(myzeit,getDauer(theDauer))) if(calculateTimeDifferenceInMinutes(add15MinutesToTime(myzeit,getDauer(theDauer)),myzeitAnfangNext)>3000 ){ // log(Number(calculateTimeDifferenceInMinutes( add15MinutesToTime(myzeit,getDauer(theDauer)),myzeitAnfangNext))) myCalArrTomorrowAlarm.push({ "start":mydatum+" "+ subtract15MinutesFromTime(myzeitAnfangNext,5), "end":mydatum+" "+ subtract15MinutesFromTime(myzeitAnfangNext,1), "summary":"ALARM:"+gesucht[i+1].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "), "description":"from IOB Script" }) } else{ if(i+1<gesucht.length){ myCalArrTomorrowAlarm.push({ "start":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)), "end":mydatum+" "+ add15MinutesToTime(add15MinutesToTime(myzeit,5),getDauer(theDauer)), "summary":"ALARM:"+gesucht[i+1].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/g," "), "description":"from IOB Script" }) } else{myCalArrTomorrowAlarm.push({ "start":mydatum+" "+ add15MinutesToTime(myzeit,getDauer(theDauer)), "end":mydatum+" "+ add15MinutesToTime(add15MinutesToTime(myzeit,5),getDauer(theDauer)), "summary":"ALARM:"+" Letzte Aktion", //gesucht[i].replace(/.*\[\'1\'\]\, \"(.*?)\"\, \"00000001\"\,.*/,"$1").replace(/\\r\\n/," ") "description":"from IOB Script" }) } } } //} } //log(JSON.stringify(myCalArr)); //myCalArrTomorrowAlarm=myCalArrTomorrowAlarm.slice(0,-1); //löscht letzten eintrag aus Alarm Array //log(JSON.stringify(myCalArrTomorrowAlarm)); //setState(myDP,JSON.stringify(theJson)); //toCalender(myCalArr); //toCalender(myCalArrTomorrow,myKalender,instanz); if (!wiederholung) {toCalender(myCalArrTomorrowAlarm,myKalenderAlarm,instanzAlarm); toCalender(myCalArrTomorrow,myKalender,instanz); // log("in nicht wiederholung - einmal morgens") myOldArrAlarm=myCalArrTomorrowAlarm setState(myDPOldArrayAlarm,JSON.stringify(myOldArrAlarm)); } else{ let changeDetails = findChanges(JSON.parse(getState(myDPOldArrayAlarm).val),myCalArrTomorrowAlarm) console.log(changeDetails); myOldArrAlarm=myCalArrTomorrowAlarm setState(myDPOldArrayAlarm,JSON.stringify(myOldArrAlarm)); if(changeDetails.length>0) {log(JSON.stringify(changeDetails)) for (let i=0;i<changeDetails.length;i++){ if(changeDetails[i].action=="added" || changeDetails[i].action=="changed" ) {toCalender([changeDetails[0]],myKalenderAlarmAenderung,instanzAlarmAenderung); } } }setState(myDPOldArrayAlarm,JSON.stringify(myCalArrTomorrowAlarm)); } } async function getData(){ return new Promise(async (resolve, reject) => { await request(url, async function (error, response, result) { gesucht=""; const myregex = /^this\.AddAppointment.*$/gm; gesucht=result.match(myregex); //log(gesucht) gesucht=gesucht.filter(platz => platz.includes("['1']")); //log(gesucht) if (gesucht!="" && error==null) {resolve()} else {reject()} ; }).on("error", function (e) {console.error(e);}); }); } schedule("1 5 * * *", async function () { wiederholung=false; doit(); }); /*schedule("3,33 5-23 * * *", async function () { wiederholung=true; doit(); });*/ //wiederholung=false; doit(); function toCalender(myArr,Kalender,myInstanz){ sendTo("webcal."+myInstanz, "addEvents", { calendar: Kalender, events: myArr }) } function add15MinutesToTime(time,howLong) { const [hours, minutes] = time.split(":").map(Number); let totalMinutes = hours * 60 + minutes; totalMinutes += howLong; const newHours = Math.floor(totalMinutes / 60); const newMinutes = totalMinutes % 60; const formattedNewHours = newHours < 10 ? `0${newHours}` : newHours; const formattedNewMinutes = newMinutes < 10 ? `0${newMinutes}` : newMinutes; return `${formattedNewHours}:${formattedNewMinutes}`; } function subtract15MinutesFromTime(time,howLong) { const [hours, minutes] = time.split(":").map(Number); let totalMinutes = hours * 60 + minutes; totalMinutes -= howLong; if (totalMinutes < 0) { totalMinutes += 24 * 60; // Falls die Zeit negativ wird, füge 24 Stunden hinzu } const newHours = Math.floor(totalMinutes / 60); const newMinutes = totalMinutes % 60; const formattedNewHours = newHours < 10 ? `0${newHours}` : newHours; const formattedNewMinutes = newMinutes < 10 ? `0${newMinutes}` : newMinutes; return `${formattedNewHours}:${formattedNewMinutes}`; } function getDauer(dauer){ // const minChange=[{"18":30},{"27":45},{"36":60},{"45":75},{"54":90},{"63":105},{"72":120},{"81":135},{"90":150},{"99":165},{"108":180}]; // log(String(minChange["18"])) return (dauer/9)*15 } function calculateTimeDifferenceInMinutes(startTime, endTime) { const [startHours, startMinutes] = startTime.split(":").map(Number); const [endHours, endMinutes] = endTime.split(":").map(Number); const totalStartMinutes = startHours * 60 + startMinutes; const totalEndMinutes = endHours * 60 + endMinutes; let timeDifference = totalEndMinutes - totalStartMinutes; if (timeDifference < 0) { timeDifference += 24 * 60; // Falls die Differenz negativ wird, füge 24 Stunden hinzu } return timeDifference; } /* function findChanges(oldArray, newArray) { const changes = []; newArray.forEach(newItem => { const oldItem = oldArray.find(item => item.start === newItem.start); if (!oldItem) { changes.push({ start: newItem.start, action: "added" }); } else { const changedKeys = Object.keys(newItem).filter(key => oldItem[key] !== newItem[key]); if (changedKeys.length > 0) { changes.push({ start: newItem.start, action: "changed", keys: changedKeys }); } } }); oldArray.forEach(oldItem => { const newItem = newArray.find(item => item.start === oldItem.start); if (!newItem) { changes.push({ start: oldItem.start, action: "deleted" }); } }); return changes; } */ function findChanges(oldArray, newArray) { const changes = []; newArray.forEach(newItem => { const oldItem = oldArray.find(item => item.start === newItem.start); if (!oldItem) { changes.push({ ...newItem, action: "added" }); } else { const changedKeys = Object.keys(newItem).filter(key => oldItem[key] !== newItem[key]); if (changedKeys.length > 0) { const changeDetails = { ...newItem, action: "changed", changedKeys }; changes.push(changeDetails); } } }); oldArray.forEach(oldItem => { const newItem = newArray.find(item => item.start === oldItem.start); if (!newItem) { changes.push({ ...oldItem, action: "deleted" }); } }); return changes; }
  • Kann mir jemand zu dieser Fehlermeldung einen Hinweis geben?

    21
    2
    0 Votes
    21 Posts
    2k Views
    B
    @dp20eic Moin Bernd, danke für die ausführliche Anleitung. So ganz easy erscheint es mir aber dennoch nicht. Bisher ist der Fehler nicht wieder aufgetaucht. Ich warte noch mal ab. Anderenfalls werde ich sicher noch mal nachfragen VG Ingo
  • Reboot Erkennung

    7
    0 Votes
    7 Posts
    517 Views
    HomoranH
    @thomas-braun sagte in Reboot Erkennung: @homoran Ist 'Zum Slave' eigentlich deine Stammkneipe? nöö, das ist mir zu link
  • Selektor für gruppierte Funktionen

    3
    1
    0 Votes
    3 Posts
    329 Views
    S
    @paul53 Danke dir. Finde ich irgendwie unglücklich, da man nach Umsortierung von Funktionen in andere Ordner dann auch die Abfragen ändern muss. Aber gut, gibt schlimmeres.
  • Funktionsweise Shuttercontrol

    8
    0 Votes
    8 Posts
    258 Views
    paul53P
    @mika-0 sagte: Also das könnte ich ja auch über meine SPS realisieren. Ja, wenn du es kannst.
  • Changelog in Vis (Anwender) darstellen

    2
    0 Votes
    2 Posts
    97 Views
    HomoranH
    @mika-0 mal als Stichworte: eventlist-widget eigenen Datenpunkt vom typ String angebunden an ein Input-Widget Datenpunkt loggen eventlis-widget darauf konfigurieren ergibt dann so etwas [image: 1696324341412-screenshot_20231003-111158_firefox.jpg] hier wird der Inhalt allerdings per Blockly befüllt
  • Update / Hinweis im Log

    2
    0 Votes
    2 Posts
    235 Views
    Thomas BraunT
    @ljsven sagte in Update / Hinweis im Log: /bin/sh: 1: mysqldump: not found Da dürfte lokal ein Paket fehlen. Schau Mal in das Backitup-Wiki rein, dass steht drin was fehlt Zum ersten: iob upload all
  • Zeitversatz zwischen State-Zeit und der Zeit einer Messung

    10
    1
    0 Votes
    10 Posts
    733 Views
    S
    @ticaki Wenn das funktioniert, ist es exakt das, was ich gesucht habe. Danke! Habe ich so aus der Doku nicht herausgelesen. Der Source scheint dies aber zu bestätigen. Werde ich dann testen. Danke!
  • Neue icons für dasWetter

    daswetter
    52
    0 Votes
    52 Posts
    10k Views
    S
    @djmarc75 Vielen Dank
  • E-Mail-Adapter und Dateianhänge

    10
    0 Votes
    10 Posts
    759 Views
    haus-automatisierungH
    @penumbra sagte in E-Mail-Adapter und Dateianhänge: Im Outlook und Thunderbird wird alles richtig angezeigt. Nur in der GMX-App sowie in der Web-Version haut es nicht hin. Das hab ich schon verstanden - daher ja die Idee die Mail genauer anschauen (wie die MIME-Types / Header usw aufgebaut sind, Reihenfolge der Attachments usw.). Dafür bräuchte man nur die RAW Mail als Text - und nicht das was ein Client daraus zaubert als Screenshot :) Also eine funktionierende Variante und die nicht funktionierende Mail auf GMX.
  • FLOT nicht mehr aufrufbar - Warnung im Protokoll

    Moved
    60
    0 Votes
    60 Posts
    5k Views
    K
    @homoran Aliase funktionieren Danke das war es mit den 3 x 3 Pixeln :-) Klasse :-) [image: 1696248643714-9c2072b6-a58e-4220-8b9e-a8d4e7623031-image-resized.png]
  • kann vis nicht installieren

    29
    0 Votes
    29 Posts
    3k Views
    L
    @Homoran Ich habe Mut zur Lücke bewiesen und den Befehl iob del vis ausgeführt. Danach ließ sich der Adapter neu installieren und das File war noch da.
  • Deconz Adapter hält keine Verbindung zu Conbee II

    connection error deconz
    3
    0 Votes
    3 Posts
    521 Views
    Franz DelcuveF
    @marc-berg Hi Marc, vielen Dank für den Hinweis. Ich habe den Container angepasst, jetzt funktioniert die Verbindung. Viele Grüße
  • Kalenderadapter: Hat schon mal jemand events kopiert?

    3
    0 Votes
    3 Posts
    275 Views
    B
    @jey-cee Es geht um den fullcalendar, sorry... [image: 1696190809615-e7a2e658-5456-4fd3-b5d9-36b464389275-grafik.png] Da steht in der Leiste links, wie man Events kopiert, Ubd das habe ich mit 3 Browsern probiert. Geht nicht... Auch nicht auf den Demo-Seiten.
  • Solaredge SE8K-RWS Nachtmodus über Modbus

    3
    0 Votes
    3 Posts
    838 Views
    A
    Danke. Dann werde ich mich mal schlau machen.
  • Nach Update läuft nichts mehr!

    iobroker update npm js controller update json help wanted
    416
    0 Votes
    416 Posts
    75k Views
    HomoranH
    @speedyblade danke! dann bleibt doch wieder die Frage was im Backup drin ist. (und der Header fehlt immer noch)

467

Online

32.8k

Users

82.9k

Topics

1.3m

Posts