@nashra Also ich kann Dir empfehlen auf Standard 433Mhz Sensoren zu gehen, Die kannst Du dann beispielsweise mit einer Sonoff RFBridge annehmen und auf die Meldungen reagieren.
Die gibt es auch für open/close (mit zwei Codes), so dass man auf beides reagieren kann. Da die nur mittels Magnetkontakt arbeiten und sonst nichts weiter machen, hält die Batterie da quasi ewig.
NEWS
Best posts made by Great SUN
-
RE: Fensterkontakte, nur welche??
-
RE: [gelöst]Invalide Date
@sigi234 Ich hab so etwas in der Art auch gerade hinter mir. Hast Du evtl. im Objekt einen Locale Date(Time)String und möchtest den zu einem Date Objekt wandeln, damit Du dann Werte vergleichen kannst?
Hier habe ich einen Code für Dich (und andere), mit dem Du den "localized" Date(Time)String zurück verwandeln kannst:
function getLocaleDateTimeFormatString() { var localeDateStr = new Intl.DateTimeFormat(Intl.DateTimeFormat().resolvedOptions().locale).formatToParts().map( function(e) { switch(e.type) { case 'month': return 'MM'; break; case 'day': return 'DD'; break; case 'year': return 'YYYY'; break; default: return e.value; }; } ).join(''); return localeDateStr + ' HH:mm:ss'; } var localeDateTime = '13.5.2022, 12:27:59'; var moment = require('moment'); var myNormalDateObject = moment(localeDateTime, getLocaleDateTimeFormatString());
Ich hoffe, das hilft. Würde mich über einen (V)ote freuen, wenn dem so ist.
Danke!
-
RE: Radar 2.0 Adapter
@nick-the-bird-92 Vielleicht kannst Du bei Deinem Handy ja auf "neues Device pairen" oder so ähnlich gehen und dann nochmal schauen, vielleicht siehst Du es dann
-
RE: iQontrol Vis Support Thread
@meute Also bzgl. des Switch-Problems und dem json. Ich hab da mal beide nebeneinander gelegt und, wenn Du mich fragst, liegt es an der Konfiguration von State und/oder Toggle.
Ich hab natürlich keine Ahnung, auf welche Device-Endpunkte/-States Deine Aliase verweisen, aber ich würde mal schätzen, dass die beiden Konfigurationen sich dahingehend unterscheiden.
Ein schalten funktioniert nur dann richtig, wenn
a) Der richtige Status da ist (Schalter) bzw. der zu setzende Wert immer der selbe ist (Taster)
b) Der richtige Endpunkt für den Schalter/Taster angesprochen wirdWenn Du da nochmal drüberschaust bzw. die entsprechenden Alias-Links teilst (hab jetzt nicht weiter im Thread gelesen), kann ich da nochmal drauf schauen. Alternativ findest aber vielleicht da schon selbst Deinen Fehler.
da_woody
{ "state": "STATE", "commonRole": "linkedState", "value": "alias.0.Drassburg.Erdgeschoss.Garage.Garagentor.door" }, { "state": "TOGGLE", "commonRole": "linkedState", "value": "alias.0.Drassburg.Erdgeschoss.Garage.Tortaster .Switch" }
Deins
{ "state": "STATE", "commonRole": "linkedState", "value": "alias.0.ZuHause.Garage.Garagentor.State" }, { "state": "TOGGLE", "commonRole": "linkedState", "value": "alias.0.ZuHause.Garage.Garagentor.Switch" }
-
RE: Sonoff NSPanel
@armilar Ja, ich brauch wie gesagt nur ein wenig Anlauf-Hilfe, da ich evtl. nicht alles so bauen mag, wie die Meisten
Und Du bist da wahrscheinlich der Einzige, der das wirklich kann -
RE: [gelöst]Invalide Date
@sigi234 Also, entsprechend Deiner Rückmeldung hatte ich wohl Recht. Ich war so frei und hab es Dir mal einfach gemacht.
Der Code sollte copy&paste funktionieren, wenn der von Dir gepastete code bei Dir im Einsatz ist. Ich hab auch entsprechend eine mini Versionsdoku dazu gepackt. Freu mich auf Deine Rückmeldung!/* Versionshistorie: * * 1.0.3: * - neu: Fix für moment locale um mit lokalen source Daten arbeiten zu können * * 1.0.2: * - neu: Anzeige der letzten An- und Abmeldung * - neu: Verwendung eigener Bilder möglich * * 1.0.1: * - neu: In dem Mapping der IP-Adressen kann jetzt eine URL vergeben werden ('http' oder direkt eine spezifische URL) * - geändert: Styling der Details * - entfernt: MAC-Adresse * * 1.0.0: * - Initial Release */ const moment = require("moment"); // Skript Einstellungen ************************************************************************************************************************************************* let dpList = '0_userdata.0.vis.NetzwerkStatus.jsonList'; // Datenpunkt für IconList Widget (Typ: Zeichenkette (String)) let dpSortMode = '0_userdata.0.vis.NetzwerkStatus.sortMode'; // Datenpunkt für Sortieren (Typ: Zeichenkette (String)) let dpFilterMode = '0_userdata.0.vis.NetzwerkStatus.filterMode'; // Datenpunkt für Filter (Typ: Zeichenkette (String)) const checkInterval = 10; // Interval wie oft Status der Skripte aktualisiert werden soll (in Sekunden) let sprache = 'de'; // Sprache für formatierung letzte Änderung let formatierungLastChange = "ddd DD.MM - HH:mm"; // Formatierung letzte Änderung -> siehe momentjs library let imagePath = '/vis.0/' // Pfad zu den verwendeten Bildern (bitte über den VIS Dateimanager hochladen) // nach Variable imagePath suchen und die entsprechenden Zeilen aus- bzw. einkommentieren // Das Bild (Dateiformat png) in der Mapping-Liste hinterlegen let defaultImage = 'ip-network-outline'; // Standardbild, falls kein Bild angegeben wurde (Material Design Icons) //let defaultImage = `${imagePath}default.png`; // Standardbild, falls kein Bild angegeben wurde (eigenes Bild) let farbeGeraetOnline = 'lime'; // Status Bar Farbe wenn Geräte online ist let farbeGeraetOffline = 'red'; // Status Bar Farbe wenn Geräte offline ist let sortResetAfter = 120; // Sortierung nach X Sekunden auf sortReset zurücksetzen (0=deaktiviert) let sortReset = 'name' // Sortierung auf die zurückgesetzt werden soll let filterResetAfter = 120; // Filter nach X Sekunden zurücksetzen (0=deaktiviert) const deviceNames = [{ ip: "192.168.178.29", alias: "Echo Dot Bad", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.32", alias: "Echo Dot SZ", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.66", alias: "Echo Dot Büro", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.49", alias: "Echo Dot Küche", image: "/vis.0/Dot_3.png", link: "http" }, { ip: "192.168.178.54", alias: "Show 5 WZ", image: "/vis.0/Echo-Show-5.png", link: "http" }, { ip: "192.168.178.1", alias: "Router Büro", image: "/vis.0/fritzbox_6590_left_de_640x400.png", link: "http" }, { ip: "192.168.178.25", alias: "Yamaha AVR WZ", image: "/vis.0/reeiver1.png", link: "http" }, { ip: "192.168.178.24", alias: "Handy Ilse", image: "/vis.0/Galaxy_S6.jpg", link: "http" }, { ip: "192.168.178.47", alias: "Handy Sigi", image: "/vis.0/huawei.png", link: "http" }, { ip: "192.168.178.44", alias: "Echo Flex Vorraum", image: "/vis.0/echo_flex.png", link: "http" }, { ip: "192.168.178.41", alias: "LG TV Wohnzimmer", image: "/vis.0/LG_TV_2.png", link: "http" }, { ip: "192.168.178.40", alias: "Switch Büro", image: "/vis.0/it_network.svg", link: "http" }, { ip: "192.168.178.33", alias: "BroadLink WiFi Device", image: "/vis.0/broadlink-2-545x410.png", link: "http" }, { ip: "192.168.178.52", alias: "Drucker Wlan Büro", image: "/vis.0/mfc9332cdw_main.png", link: "http" }, { ip: "192.168.178.20", alias: "Medion PC Büro", image: "/vis.0/it_pc.svg", link: "http" }, { ip: "192.168.178.22", alias: "Philips Hue Bridge Büro", image: "/vis.0/PHILIPS-51180000-Hue--Bridge--3-Watt.png", link: "http" }, { ip: "192.168.178.28", alias: "Funksteckdose Drucker Büro", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.56", alias: "Stehlampe Blub Esszimmer", image: "/vis.0/Birne.png", link: "http" }, { ip: "192.168.178.30", alias: "Huawei Sigi alt", image: "/vis.0/huawei.png", link: "http" }, { ip: "192.168.178.99", alias: "CCU3 Büro", image: "/vis.0/ccu3-v_1.png", link: "http://192.168.178.99" }, { ip: "192.168.178.36", alias: "Bosch Geschirrspüler Küche", image: "/vis.0/13271013_SPV4HMX61E_STP_def.png", link: "http" }, { ip: "192.168.178.35", alias: "Steckdosenleiste Bad", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.39", alias: "Fire Tv", image: "/vis.0/fire_tv.png", link: "http" }, { ip: "192.168.178.23", alias: "Funksteckdose Medion PC", image: "/vis.0/TPLINK_HS110_01.png", link: "http" }, { ip: "192.168.178.51", alias: "Samsung TV Büro", image: "/vis.0/LG_TV_2.png", link: "http" }, { ip: "192.168.178.26", alias: "Steckdose Meross WZ", image: "/vis.0/Meross.png", link: "http" }, { ip: "192.168.178.37", alias: "Iphone Sarah", image: "/vis.0/iphone 6.jpg", link: "http" }, { ip: "192.168.178.50", alias: "Samsung Tab", image: "/vis.0/Samsung Tab.png", link: "http" }, { ip: "192.168.178.27", alias: "Meross Blub Esszimmer", image: "/vis.0/Birne.png", link: "http" }, ]; //********************************************************************************************************************************************************************** function getLocaleDateTimeFormatString() { var localeDateStr = new Intl.DateTimeFormat(Intl.DateTimeFormat().resolvedOptions().locale).formatToParts().map( function(e) { switch(e.type) { case 'month': return 'MM'; break; case 'day': return 'DD'; break; case 'year': return 'YYYY'; break; default: return e.value; }; } ).join(''); return localeDateStr + ' HH:mm:ss'; } var localeDateFormatStr = getLocaleDateTimeFormatString(); // auf Änderungen aktiver Skripts hören let activeSelector = `[id=tr-064.*.devices.*.active]`; let deviceActiveList = $(activeSelector); if (deviceActiveList.length === 0) { // Fehlermeldung ausgeben, wenn selector kein result liefert console.error(`no result for selector '${activeSelector}'`) } else { // listener nur für Änderung bei alive deviceActiveList.on(netzwerkStatus); } // auf Änderungen der Sortieung hören on({ id: dpSortMode, change: 'any' }, netzwerkStatus); on({ id: dpSortMode, change: 'any' }, resetSort); // // auf Änderungen der Filter hören on({ id: dpFilterMode, change: 'any' }, netzwerkStatus); on({ id: dpFilterMode, change: 'any' }, resetFilter); // Funktion adapterStatus alle x Sekunden ausführen schedule('*/' + checkInterval + ' * * * * *', netzwerkStatus); function netzwerkStatus() { try { let deviceList = []; for (var i = 0; i <= deviceActiveList.length - 1; i++) { let id = deviceActiveList[i].replace('.active', ''); let obj = getObject(id); let pattern = /(?:\d{1,3}\.){3}\d{1,3}/i; let ipAddress = obj.common.name.match(pattern)[0]; let image = defaultImage; let deviceName = obj.common.name.replace(/ \((?:\d{1,3}\.){3}\d{1,3}\)/g, ''); let device = deviceNames.find(element => element.ip == ipAddress); let listType = 'text'; let buttonLink = ''; if(device) { deviceName = device.alias; image = device.image; //image = `${imagePath}${device.image}.png`; if(device.link) { listType = 'buttonLink'; if(device.link == 'http') { buttonLink = `http://${ipAddress}`; } else { buttonLink = device.link; } } } let macAddress = obj.native.mac; let imageColor = 'white'; let statusBarColor = farbeGeraetOffline; let status = 2; if (getState(deviceActiveList[i]).val) { statusBarColor = farbeGeraetOnline; status = 1; } if(listType === 'buttonLink') { deviceName = `<span style="text-decoration: underline">${deviceName}</span>` } let lastSignIn = 'noch nicht angemeldet'; let lastSignOff = 'noch nicht abgemeldet'; // Letzte Anmeldung auslesen if(existsState(id + '.lastActive')) { lastSignIn = 'angemeldet seit: ' + moment(getState(id + '.lastActive').val, localeDateFormatStr).format("DD.MM.YY HH:mm:ss"); } // Letzte Abmeldung auslesen if(existsState(id + '.lastInactive')) { lastSignOff = 'abgemeldet seit: ' + moment(getState(id + '.lastActive').val, localeDateFormatStr).format("DD.MM.YY HH:mm:ss"); } let subText = `<div style="color: green; font-family: RobotoCondensed-BoldItalic">${ipAddress}</div> <div style="color: black; font-family: RobotoCondensed-Regular">${lastSignIn}</div> <div style="color: black; font-family: RobotoCondensed-Regular">${lastSignOff}</div>` deviceList.push({ text: deviceName, subText: subText, statusBarColor: statusBarColor, image: image, imageColor: imageColor, listType: listType, buttonLink: buttonLink, showValueLabel: false, name: deviceName, ipAddress: ipAddress, status: status }); } let sortMode = myHelper().getStateValueIfExist(dpSortMode, 'name'); if (sortMode === 'name' || sortMode === 'ipAddress') { deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } else if (sortMode === 'status') { deviceList.sort(function (a, b) { return a[sortMode] == b[sortMode] ? 0 : +(a[sortMode] < b[sortMode]) || -1; }); } else { // default: nach name sortieren sortMode = 'name' deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterMode && filterMode !== null && filterMode !== '') { if (filterMode === 'offline') { deviceList = deviceList.filter(function (item) { return item.status === 2; }); } else if (filterMode === 'online') { deviceList = deviceList.filter(function (item) { return item.status === 1; }); } } let result = JSON.stringify(deviceList); if (getState(dpList).val !== result) { setState(dpList, result, true); } } catch (err) { console.error(`[netzwerkStatus] error: ${err.message}, stack: ${err.stack}`); } } function resetSort() { let sortMode = myHelper().getStateValueIfExist(dpSortMode, null); if (sortResetAfter > 0) { setTimeout(function () { if (sortMode !== null && sortMode === myHelper().getStateValueIfExist(dpSortMode, null)) { setState(dpSortMode, sortReset); } }, sortResetAfter * 1000); } } function resetFilter() { let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterResetAfter > 0) { setTimeout(function () { if (filterMode !== null && filterMode === myHelper().getStateValueIfExist(dpFilterMode, null)) { setState(dpFilterMode, ''); } }, filterResetAfter * 1000); } } // Beim Staren des Skriptes Adapter Status abrufen netzwerkStatus(); function myHelper() { return { getStateValueIfExist: function (id, nullValue = undefined, prepand = '', append = '') { if (existsState(id)) { return prepand + getState(id).val + append; } else { return nullValue; } }, getCommonPropertyIfExist: function (object, prop, nullValue = undefined, prepand = '', append = '') { if (myHelper().checkCommonPropertyExist(object, prop)) { return prepand + object.common[prop] + append; } else { return nullValue; } }, checkCommonPropertyExist: function (object, prop) { if (object && object.common && object.common[prop]) { return true; } else { return false; } } } }
-
RE: Mehrere Heizkörper Synchronisiseren, value storm
Das mit dem Verzögern halte ich auch für Sinnvoll. Im JS würde ich das in etwa so machen:
Erstmal entweder mit $() die Heizkörpergruppe selektieren, oder, wenn das nicht geht, die ID's in einem json Objekt hinterlegen. Dann für alle den Gleichen on request machen:function changeGroupObject(sourceObjId, groupObjListId, settingsJson) { for(const [settingId, settingVal] of Object.entries(settingsJson)) { var currVal = getState(sourceObjId + '.' + settingId).val; if(currVal != settingVal) { console.log('setting changed after call, ignoring request'); return; } } var groupObjIdArr = JSON.parse(getState(groupObjListId).val); for(const destObjId of groupObjIdArr) { if(destObjId == sourceObjId) { continue; } for(const [settingId, settingVal] of Object.entries(settingsJson)) { setState(destObjId + '.' + settingId, settingVal); } } var groupObjIdArr = JSON.parse(getState(groupObjListId).val); var syncSettingArr = ['STATE.temperature', 'STATE.windowopen']; for(const destObjId of groupObjIdArr) { for(const settingId of syncSettingArr) { on({id: destObjId + '.' + settingId, change: 'ne'}, async function(obj) { setTimeout(function () { changeGroupObject(destObjId, groupObjListId, {settingId: obj.state.val});. 2000); // 2sec, könnte man drüber nachdenken, das zu ändern ;-) }) } }
Mit dem Code oben könnte man von der Basis her auch noch verschiedene Werte gleichzeitig prüfen und verändern, so dass bei mehreren Änderungen nur ein setState aufgerufen werden muss pro Gerät/Eigenschaft.
Ich hoffe, das hilft Dir evtl. etwas
-
RE: Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)
@beowolf Wenn das Deine Lösung ist, würde ich mich über ein Voting meines Beitrags freuen
EDIT: Solltest Du noch Hilfe brauchen, weißt Du ja, wo Du uns findest -
RE: Fensterkontakte, nur welche??
@nashra Vorteil der 433Mhz Sensoren ist eben, dass sie nicht regelmäßig senden müssen. Nachteil ist im Grunde, dass sie keine Überwachung haben (Batterie), dafür hält die Batterie aber auch entsprechend länger, je nach dem, wie oft jetzt auf und zu gemacht wird.
Klar brauchst Du einen Empfänger für die RF-Signale, das muss keine Sonoff RFBridge sein. Das ist nur das, was ich einsetze.
Für 433Mhz gibt es dann auch noch Taster etc. mit denen man wieder andere Funktionalitäten realisieren kann.
Zigbee ist echt nett, aber wenn Du nicht eh ganz viele davon hast, ist der Verbrauch gerade auf Entfernung sehr viel höher und damit die Batterie schneller leer. Das Gleiche dürfte für Deinen Shelly gelten, der natürlich draußen auch einen schlechteren Empfang hat und damit mehr Energie verbraucht. -
RE: Daten von Python3 in Datenpunkt schreiben
@jan-schmeckenbecher
Du hast zwei einfache Möglichkeiten:- Vom Python Script aus: Auf http://ipaddress:8087/help (oder #tab-adapters/readme/simple-api von Deinem Admin-UI) findest Du die Doku
- Mit Blockly/JS Python script ausführen und die Ausgabe dann Parsen und eintragen.
Bei Fragen, gern schreiben.
Latest posts made by Great SUN
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
Hi Ihr
Ich hab die Version 0.6.0 und grundsätzlich sehe ich zumindest keinerlei Fehler.
Die Daten scheinen auch alle zu stimmen soweit.Mein Auto ist ein Skoda Enyaq 85x.
Wollte mal fragen, was es mit den folgenden Datenpunkten auf sich hat und wie (wenn) ich diese nutzen kann, da der aktuelle Wert nur "null" ist.
vw-connect.0.TMBGH9NY6RF013968.remote.climatisation vw-connect.0.TMBGH9NY6RF013968.remote.climatisationv2 vw-connect.0.TMBGH9NY6RF013968.remote.lock vw-connect.0.TMBGH9NY6RF013968.remote.lockv2 vw-connect.0.TMBGH9NY6RF013968.remote.chargeMinLimit vw-connect.0.TMBGH9NY6RF013968.remote.maxChargeCurrent
Super arbeit in jedem Fall! Vielen lieben Dank!
-
RE: Ecovacs Deebot Adapter: Informationen und Praxistipps
@mrbungle64 Meinst Du, es gibt die Möglichkeit eine Füllstandsmeldung zu bekommen (Frischwasser leer/Abwasser voll)?
-
RE: iobroker zeschossen
@krisiun sagte in iobroker zeschossen:
krisiun@Marek2:/root$ reboot System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
Wie ich sagte, Du hast WSL, das ist ein Service in Deinem Windows. Damit das sauber neu gestartet ist, Rechner neu starten.
-
RE: iobroker zeschossen
@krisiun Verglichen hab ich sie auch nicht. Hab nur gerade selbst so ein Teil gekauft, deswegen wusste ich es noch
-
RE: iobroker zeschossen
@thomas-braun sagte in iobroker zeschossen:
@krisiun sagte in iobroker zeschossen:
sudo apt autoremove
Und dann die Kiste mal neustarten. Wie auch immer das bei dem WSL-Ding geht.
sudo reboot
vielleicht?
Windoze hat das als Windows-Service laufen. Kannste nicht direkt neu starten... Am Besten WinDoze neu starten:
https://www.wikihow.com/Shut-Down-Your-PC-with-a-Shortcut-Key -
RE: iobroker zeschossen
@krisiun sagte in iobroker zeschossen:
@great-sun
für einen sind das nur 89€ für die anderen viel Geld. Nicht böse sein bitteWieso? Ich wollte nur sichergehen, dass Du nicht denkst, das Ding kostet mega viel Kohle.
-
RE: iobroker zeschossen
@djmarc75 Ja, ich wollt auch mal was (sinnvolles) beitragen
-
RE: iobroker zeschossen
@oliverio Ich kann auch noch einen HP Mini-PC empfehlen 8GB Ram, 256GB SSD, 2,9Ghz CPU. Der maximale gemessene Verbrauch unter Last lag bei dem bei 25W. Durchschnitt eher bei 5W
-
RE: Array befüllen, Abfragen und löschen
@Toby-2 Bitte den Thread als [GELÖST] markieren, wenn Du keine weiteren Fragen mehr hast