Weiter zum Inhalt

ioBroker Allgemein

29.7k Themen 437.3k Beiträge
Integrationtsplattform für IoT

NEWS

  • Adapter smartgarden Fehler 403

    33
    0 Stimmen
    33 Beiträge
    7k Aufrufe
    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 Stimmen
    48 Beiträge
    8k Aufrufe
    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

    Verschoben
    28
    0 Stimmen
    28 Beiträge
    15k Aufrufe
    ?
    @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 Stimmen
    2 Beiträge
    260 Aufrufe
    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 Stimmen
    28 Beiträge
    3k Aufrufe
    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 Stimmen
    21 Beiträge
    2k Aufrufe
    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 Stimmen
    7 Beiträge
    495 Aufrufe
    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 Stimmen
    3 Beiträge
    321 Aufrufe
    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 Stimmen
    8 Beiträge
    258 Aufrufe
    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 Stimmen
    2 Beiträge
    97 Aufrufe
    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 Stimmen
    2 Beiträge
    230 Aufrufe
    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 Stimmen
    10 Beiträge
    700 Aufrufe
    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 Stimmen
    52 Beiträge
    10k Aufrufe
    S
    @djmarc75 Vielen Dank
  • E-Mail-Adapter und Dateianhänge

    10
    0 Stimmen
    10 Beiträge
    751 Aufrufe
    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

    Verschoben
    60
    0 Stimmen
    60 Beiträge
    5k Aufrufe
    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 Stimmen
    29 Beiträge
    3k Aufrufe
    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 Stimmen
    3 Beiträge
    514 Aufrufe
    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 Stimmen
    3 Beiträge
    264 Aufrufe
    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 Stimmen
    3 Beiträge
    833 Aufrufe
    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 Stimmen
    416 Beiträge
    74k Aufrufe
    HomoranH
    @speedyblade danke! dann bleibt doch wieder die Frage was im Backup drin ist. (und der Header fehlt immer noch)

491

Online

32.8k

Benutzer

82.9k

Themen

1.3m

Beiträge