NEWS
[Adapter] - Mihome
-
Hallo zusammen,
habe jetzt eine Stunde rumgespielt und zu dem Entschluss gekommen, dass fast nichts so funktioniert wie ich es mir vorstelle.
Selbst mit Aktiver Verbindung zum Internet klappt relativ wenig.
Der Motion Sensor, der eigentlich das Nachtlicht auslösen sollte funktioniert zwar perfekt, aber das Licht schaltet sich trotz Einstellung unter "Automatisierung" vom Hub, nicht an.
Vielleicht ist es auch wieder mal eine schlechte Übersetzung, aber selbst wenn man unter "Induktionszeit" zb von 16:50 bis 16:55 einstellt, bleibt das Nachtlicht aus. Per Default war von 0 Uhr bis 0 uhr eingestellt. Vermutlich verstehe ich die Übersetzung falsch und die Funktion soll bedeuten in welcher Zeit er auf Lichtveränderungen reagiert (dunkel = Nachtlicht an). Aber selbst in einem dunklen Raum bleibt das Licht aus.
Scheinbar ist es wohl wirklich besser ein kleines Script zu machen was auf den State des Motion Sensors reagiert.
Soweit, so enttäuschend.
Zum Rauchmelder. Ob die Einstellungen offline erhalten bleiben, kann ich nicht sagen. Selbst auf niedrigster Empfindlichkeitsstufe reagiert das Ding meiner subjektiven Meinung nach absolut unverändert schnell beim Dampf.
Im Moment sehe ich keine sinnvolle Begründung warum dieses Ding ein Internetverbindung haben sollte.
Nachtrag1:
So Problem gelöst ohne Internetanbindung des Hub:
var MOTION1 = 'mihome.0.devices.sensor_motion_aq2_158d0002e940d5.state'; var AKTOR1 = 'scene.Nachtlicht_Xioami-Hub'; on({id: MOTION1, change: "ne", val: true}, function (obj) { setState(AKTOR1, true); });
Manchmal kann es so einfach sein….
Nachtrag2:
Induktionszeit bedeutet, in welchem Zeitrahmen das Gerät auf den Motion Sensor überhaupt reagiert. Dieses konnte ich anhand der Option "Verzögerungszeit für das Ausschalten des Lichts, nachdem die Person das Gebäude verlassen hat" feststellen. Ist es innerhalb der Zeit wird das Nachtlicht nach x Minuten ausgeschaltet.
Das passiert auch, wenn der Sensor über Iobroker getriggert wurde.
Liegt es außerhalb der Zeit, nachdem Iobroker getriggert hat, bleibt es einfach an.
Jetzt gilt es nur noch herauszufinden warum der Sensor nicht direkt das Nachtlicht anschaltet mit der in der MiHome-App hinterlegten Automatisierung.
Nachtrag3:
So, nun zu 99% sicher das alles an individuellen Einstellungen in der Cloud gespeichert sind und beim Start des Hub abgerufen wird. Bedient sich dann der Standardwerte, wenn er offline ist. Somit ist alles was in der App als Automatisierung hinterlegt ist nicht mehr gescheit nutzbar. Schade.
Nachtrag4:
Es ist leider noch viel schlimmer. Offline verliert das Ding jedes Zeitgefühl und agiert willkürlich. Mal geht das Nachtlicht nach 5 Minuten aus, mal nach einer Stunde. Für meine Umgebung zum Glück total egal. Nachtlichter sind in der regel Nachts eh immer an. Da es auf den Bewegungssensor reagiert, spielt es keine Rolle. Im Gegensatz zum HUB, scheint der Motion Sensor auch keine Lux Werte mehr zu melden wenn der Hub Offline ist.
-
Mal so eine Frage nebenher.
Wie hast du im Unifi dem Gateway das Internet verboten? Also welche Einstellungen hast du vorgenommen?
-
Habe mir heute nen Satz Ikea tradfri Lampen gekauft und mit dem Xiaomi Gateway verbunden. Leider erscheinen sie bei iobroker nicht unter Objekten. Ist die Einbindung noch geplant ?
-
Mal so eine Frage nebenher.
Wie hast du im Unifi dem Gateway das Internet verboten? Also welche Einstellungen hast du vorgenommen? `
Im Unifi überhaupt nicht. Ich habe noch einen DHCP Server laufen. Dort habe ich einfach für den mihome eine Reservierung auf die MAC-Adresse gemacht und als DNS Server und Gateway jeweils 0.0.0.0 zugewiesen.
-
Habe mir heute nen Satz Ikea tradfri Lampen gekauft und mit dem Xiaomi Gateway verbunden. Leider erscheinen sie bei iobroker nicht unter Objekten. Ist die Einbindung noch geplant ? `
Wenn ich mir die Produktübersicht des Adapters anschaue, würde ich einfach mal auf nein tippen. Also entweder das Tradfri Gateway , ein Hue Gateway oder die USB-Stick Zigbee-Lösung für die Bastler nehmen.
-
Die IKEA Unterstützung von Xiaomi ist ja recht neu. Da ist es klar dass im Adapter bisher nur Xiaomi Produkte unterstützt wurden.
Die Frage ist eher ob ein Entwickler Zeit hätte/fände den Adapter weiterzuentwickeln.
Und zuerst müsste mal jemand im Log (debug level) prüfen ob das Gateway überhaupt Werte der IKEA Teile raus reicht.
-
Mal so eine Frage nebenher.
Wie hast du im Unifi dem Gateway das Internet verboten? Also welche Einstellungen hast du vorgenommen? `
Im Unifi überhaupt nicht. Ich habe noch einen DHCP Server laufen. Dort habe ich einfach für den mihome eine Reservierung auf die MAC-Adresse gemacht und als DNS Server und Gateway jeweils 0.0.0.0 zugewiesen. `
Danke!
-
Weiß jemand ob möglich ist sowas wie einen "last seen/is reachable" state zu erzeugen ?
Während man das bei den humidity-sensoren noch gut an den geänderten Werten erkennen kann, ist das beim Rauchmelder und Gasmelder nicht mehr so einfach. Im Iobroker ist defacto überhaupt nicht zu erkennen das mein Rauchmelder seit 3 Wochen ohne Batterie hier rumliegt.
Nur um sicher zu gehen, dass das Gerät auch das Gateway erreichen kann, wäre so ein state praktisch.
-
hab keinen Rauchmelder von xiaomi, aber der Rauchmelder liefert doch bestimmt auch seinen Batteriestatus in %
Da kannst du doch mit script auf dem Datenpunt auf "last update" prüfen.
Blockly: das Puzzle-Ding mit "[Wert] von [ObjectID]" nehmen, auf Wert klicken und [letzte Änderung] auswählen.
JS: getState("mihome.0.devices.magnet_0815abcd0000000.percent").lc;
wenn länger als 1 Tag her Nachricht wohin auch immer…
edit: oder der Wert<15 Warnhinweis" batterie kaufen; wert=0 Fehlermeldung :idea:
-
Nur um sicher zu gehen, dass das Gerät auch das Gateway erreichen kann, wäre so ein state praktisch. `
Eine „unreach“ Meldung oder ähnliches ist bei Xiaomi anscheinend nicht üblich. Auch in der App habe ich bisher keine Meldefunktion bei Nichterreichbarkeit gefunden.Die Rauchmelder aktualisieren mind. 1x pro Stunde ihren Batteriestatus, was man wiederum gut als „alive“ Meldung weiterverarbeiten kann. Meldet sich das Gerät nicht innerhalb 1 Stunde ist etwas faul… Ich überprüfe jedes Gerät einzeln per Blockly:
-
@J Riemann
Das ist tatsächlich eine nützliche Idee. Nur mit Blockly kann ich nichts anfangen. Hatte mich entschieden Javascript zu erlernen (so gut es geht). Mal schauen wie es sich damit bewerkstelligen lässt.
Der Timestamp-Wert scheint aber relevanter als der "letzte Änderung"-Wert.
Beispiel: Der Gas-Melder wird per Netzteil betrieben und steht somit immer auf 100%. Daher hat sich der "letzte Änderung"-Wert seit der Anschaffung nicht geändert. Der Timestamp hat zumindest einen Zugriff verzeichnet.
Gleiche Spiel beim Rauchmelder. Lag ein paar Tage in der Ecke, gestern mal wieder angeschlossen für 2-3 Stunden.
Da die eingelegte Batterie immer noch 100% hat, hat sich der "letzte Änderung"-Wert nicht geändert. Der Zeitstempel hingegen schon. (Siehe Bild).
4505_1.jpg -
Der Gas-Melder wird per Netzteil betrieben und steht somit immer auf 100%. `
Welches Meldeverhalten der Gas-Sensor hat kann ich nicht sagen da ich keinen besitze.Ansonsten ist "bei Aktualisierung" die richtige Wahl… Die Sensoren melden ja auch unveränderte Batteriewerte...
-
@J Riemann:Der Gas-Melder wird per Netzteil betrieben und steht somit immer auf 100%. `
Welches Meldeverhalten der Gas-Sensor hat kann ich nicht sagen da ich keinen besitze.Ansonsten ist "bei Aktualisierung" die richtige Wahl… Die Sensoren melden ja auch unveränderte Batteriewerte... `
Also auch wenn ich meine Sensoren angucke, kann ich deine Aussage leider nicht bestätigen.
Anbei ein Bild eines Sensors für Türen/Fenster.
Ein Batteriestand wurde das letzte mal gestern gegen 17 Uhr geändert. Während der Zeitstempel einen Wert von heute morgen hat.
Für zeitnahe Abfragen scheint mir der Timestamp besser geeignet.
Jetzt nur noch rausfinden wie man in Javascript damit rechnet
4505_2.jpg -
Hab gerade kein iobroker zu Hand, aber probier mal so an den timestamp zu kommen:
var myTimestamp = getState("pfad.zu.meinem.Objekt_Datenpunkt").ts;
Den Zahlenwert kannst du ganz normal mit Grundrechenarten oder Date-funktionen verarbeiten.
-
Hab gerade kein iobroker zu Hand, aber probier mal so an den timestamp zu kommen:
var myTimestamp = getState("pfad.zu.meinem.Objekt_Datenpunkt").ts;
Den Zahlenwert kannst du ganz normal mit Grundrechenarten oder Date-funktionen verarbeiten. `
Danke für deine Rückmeldung. Habe ich schon gefunden und das Script ist auch schon soweit fertig. Jetzt werde ich erst mal den Rauch- und Gas-Melder im Auge behalten, wie oft die den Timestamp erneuern, um keine Fehlalarme zu bekommen.
Da ich kein Programmierer bin, ist das Script 100 Zeilen groß geworden. Man hätte sich vermutlich die ein oder andere variable oder umständliche Rechnung ersparen können -…aber dafür kann das Script auch was.
Zb. nach festgelegten Intervallen Alexa eine Ansage machen lassen, eine Email versenden oder eine Telegram-Nachricht wenn das Gerät nicht erreichbar ist.
-
Ok geht alles.
Für den Gasmelder sollte man den Zeitstempel (nicht letzte Änderung) von voltage oder percent nehmen. Dieser wird alle 15min vom Gasmelder aktualisiert.
Rauchmelder verhält sich fast genauso, nur unzuverlässiger. Mal nach 15 Minuten mal nach 40, mal nach 45… Keine Updates in "letzte Änderung" sondern nur in den Timestamps von voltage und percent.
Rate dringend ab, bei Zigbee Geräte den "letzte Änderung" input zu nehmen. Dieser wird wirklich nur aktualisiert, wenn sich was ändernt und ist somit kein Indikator.
Da scheinbar doch ein Zugriff erfolgt, auch wenn sich nichts geändert hat, ist die Timestamp hier zu bevorzugen.
4505_3.jpg -
schön, dass es jetzt funktioniert. Wenn du magst stelle dein script doch hier zur Verwendung rein. Auch wenn es noch nicht perfekt optimiert ist. Die Experten hier können mal drüber gucken und vielleicht noch hilfreiche Tipps geben. Ich bin mit js auch noch nicht so fit und lerne gerne dazu.
-
schön, dass es jetzt funktioniert. Wenn du magst stelle dein script doch hier zur Verwendung rein. Auch wenn es noch nicht perfekt optimiert ist. Die Experten hier können mal drüber gucken und vielleicht noch hilfreiche Tipps geben. Ich bin mit js auch noch nicht so fit und lerne gerne dazu. `
Uh ich weiss nicht. Ist mir schon ein wenig peinlich. Ist bestimmt so schlecht,das jeder der schon mal programmiert hat, die Hände über den Kopf zusammenschlägt
Aber bitte, anbei meine erste programmierte Schande .
// überwachung von mihome smoke var SENSOR1 = 'mihome.0.devices.smoke_158d00024e8ed9.voltage'; // Überwachendes Gerät . Voltage oder Percent State nehmen ! var BEZEICHNUNG1 = 'Rauchmelder'; // Gerätebezeichnung var WARNALEXA = 600 ; // So oft werden Warnmeldungen via Alexa wiederholt (in Minuten) (zwischen 14 und 20 Uhr) (minimum 61) var WARNEMAIL = 600 ; // So oft werden Warnmeldungen via Email wiederholt (in Minuten) (minimum 61) var WARNTELEGRAM = 200 ;// So oft werden Warnmeldungen via Telegram wiederholt (in Minuten) (minimum 61) createState("mihome.smoke_158d00024e8ed9.active",0, { //noch ungenutzt read: true, write: true, name: BEZEICHNUNG1 + " last active in minutes", role: "indicator.connected" }); createState("mihome.smoke_158d00024e8ed9.telegram",0, { read: true, write: true, name: BEZEICHNUNG1 + " last telegram warning", role: "state" }); createState("mihome.smoke_158d00024e8ed9.alexa",0, { read: true, write: true, name: BEZEICHNUNG1 + " last alexa announcement warning", role: "state" }); createState("mihome.smoke_158d00024e8ed9.email",0, { read: true, write: true, name: BEZEICHNUNG1 + " last email announcement warning", role: "state" }); schedule ('*/30 * * * *', function(){ //so oft wird das script ausgeführt var DATUM2 = new Date().getTime();// Datum in Millisekunden var WERT1 = getState(SENSOR1).ts; // Sensor Timestamp einlesen in Millisekunden var RECHNEN=((DATUM2-WERT1)); // Datum - Sensorzeit = Last Seen-Zeit var ENDRECHNUNG=Math.round(RECHNEN/3600000*60); var LASTALEXA=getState('javascript.0.mihome.smoke_158d00024e8ed9.alexa').val; var LASTEMAIL=getState('javascript.0.mihome.smoke_158d00024e8ed9.email').val; var LASTTELEGRAM=getState('javascript.0.mihome.smoke_158d00024e8ed9.telegram').val; var ZEITALEXA=Math.round((DATUM2-LASTALEXA)/3600000*60); var ZEITEMAIL=Math.round((DATUM2-LASTEMAIL)/3600000*60); var ZEITTELEGRAM=Math.round((DATUM2-LASTTELEGRAM)/3600000*60); setState('mihome.smoke_158d00024e8ed9.active',ENDRECHNUNG , true); // last seen state in objekte schreiben. Bisher ungenutzt. Für millisekunden variable RECHNEN nehmen. if (ENDRECHNUNG>60) { if (ZEITALEXA>WARNALEXA && compareTime("14:00", "20:00", "between")) { // Warnung per Alexa Sprachausgabe setState('mihome.smoke_158d00024e8ed9.alexa',new Date().getTime()); setState('alexa2.0.Echo-Devices.<your-alexa-id-here>.Commands.speak', 'Das Gerät, ' + BEZEICHNUNG1 + ', hat sich seit ' + ENDRECHNUNG + ' Minuten nicht mehr gemeldet!'); } else { console.log('Warnung: Gerät ' + BEZEICHNUNG1 + ' ist nicht erreichbar. Nächste Alexa Warnung erfolgt in ' + (WARNALEXA-ZEITALEXA) + ' Minuten.') } if (ZEITEMAIL>WARNEMAIL){ // Warnung per Email setState('mihome.smoke_158d00024e8ed9.email',new Date().getTime()); sendTo("email", { from: "<absender-emailadresse", to:/"<empfänger-emailadresse="">", subject: "IOBroker Benachrichtigung!", text: 'Das Gerät ' + BEZEICHNUNG1 + ' hat sich seit ' + ENDRECHNUNG + ' Minuten nicht mehr gemeldet!' }) console.log(BEZEICHNUNG1 + ': Es wurde eine Warnemail für folgendes Gerät versendet: ' + BEZEICHNUNG1) } else { console.log('Warnung: Gerät ' + BEZEICHNUNG1 + ' ist nicht erreichbar. Nächste Email Warnung erfolgt in ' + (WARNEMAIL-ZEITEMAIL) + ' Minuten.') } // Warnung per Telegram if (ZEITTELEGRAM>WARNTELEGRAM){ setState('mihome.smoke_158d00024e8ed9.telegram',new Date().getTime()); sendTo('telegram', 'Das Gerät ' + BEZEICHNUNG1 + ' hat sich seit ' + ENDRECHNUNG + ' Minuten nicht mehr gemeldet!') console.log('Es wurde eine WarnTelegram für folgendes Gerät versendet: ' + BEZEICHNUNG1) } else { console.log('Warnung: Gerät ' + BEZEICHNUNG1 + ' ist nicht erreichbar. Nächste Telegram Warnung erfolgt in ' + (WARNTELEGRAM-ZEITTELEGRAM) + ' Minuten.') } } else{ console.log('Das Gerät ' + BEZEICHNUNG1 + ' hat noch nicht den 60 Minuten Zeitrahmen überschritten! Letztes mal gesehen vor ' + ENDRECHNUNG + ' Minuten.') } })</absender-emailadresse",></your-alexa-id-here>
Gibt es nicht viel zu sagen. Wird alle 30 Minuten ausgeführt und wird aktiv wenn der Rauchmelder sich mehr als 60 minuten nicht gemeldet hat (Log augabe).. wenn nach den 60 Minuten der eingestellte Schwellwert für Warnungsversand (Alexa,email, telegram) bei einer Prüfung überschritten wird, wird eine Warnung Versand. Die Warnung über Alexa Sprachausgabe erfolgt nur zwischen 14 und 20 Uhr. Dieses war für meinen eigenen Bedarf. Kann aber im Alexabereich unter compareTime geändert (oder entfernt) werden.
Die IDs der jeweiligen states müssen für das Gerät an einigen stellen noch manuell angepasst werden, da ich es noch nicht variabel gemacht habe. Dieses betrifft vorallem die getState und setState zeilen.
Da es nur für ein Gerät war, war es in meinen Augen in diesem Moment nicht notwendig modular zu arbeiten. Werde ich aber definitiv noch anpassen.
Hoffe trotz der schlechten Anfängerprogrammierung kann jemand damit was anfangen
Hier mein 2. Script um Batteriestatus aller Sensoren zu überwachen die einen battery-state in iobroker schreiben:
Hätte man vermutlich auch bedeutend einfacher gestalten könne, aber es funktioniert.
Wenn Status weniger als 20% sende via Telegram (kann aus dem ersten Code anders gestaltet werden, zb via Email) eine Benachrichtungen:
var HEMMSCHWELLE = 20 // Meldung ab diesem Batteriestand in Prozent var SENSOR1 = 'mihome.0.devices.cube_158d00029a8fd5.percent' //Cube1 var SENSOR1NAME ='Steuer Cube 1' var SENSOR2 = 'mihome.0.devices.magnet_158d00024de71d.percent' //Wohnzimmer links var SENSOR2NAME ='Wohnzimmer links' var SENSOR3 = 'mihome.0.devices.magnet_158d00024e42b9.percent' //Briefkasten var SENSOR3NAME ='Briefkasten' var SENSOR4 = 'mihome.0.devices.magnet_158d00024e50f7.percent' //Schlafzimmer rechts var SENSOR4NAME ='Schlafzimmer rechts' var SENSOR5 = 'mihome.0.devices.magnet_158d00024e621b.percent' //Bad links var SENSOR5NAME ='Bad links' var SENSOR6 = 'mihome.0.devices.magnet_158d00025193bf.percent' //Schlafzimmer links var SENSOR6NAME ='Schlafzimmer links' var SENSOR7 = 'mihome.0.devices.magnet_158d0002529a90.percent' //Kinderzimmer var SENSOR7NAME ='Kinderzimmer' var SENSOR8 = 'mihome.0.devices.magnet_158d0002529bc7.percent' //Kueche Balkontuere var SENSOR8NAME ='Kueche Balkontuere' var SENSOR9 = 'mihome.0.devices.magnet_158d000252befb.percent' //Kueche Fenster var SENSOR9NAME ='Kueche Fenster' var SENSOR10 = 'mihome.0.devices.magnet_158d0002536e79.percent' //Wohnzimmer rechts var SENSOR10NAME ='Wohnzimmer rechts' var SENSOR11 = 'mihome.0.devices.magnet_158d000271fe91.percent' //Badezimmer rechts var SENSOR11NAME ='Badezimmer rechts' var SENSOR12 = 'mihome.0.devices.magnet_158d0002735cbe.percent' // Haustuere var SENSOR12NAME ='Haustüre' var SENSOR13 = 'mihome.0.devices.sensor_motion_aq2_158d0002e940d5.percent'//Motion Leonas Zimmer var SENSOR13NAME ='Bewegungssensor Leonas Zimmer' var SENSOR14 = 'mihome.0.devices.smoke_158d00024e8ed9.percent' //Rauchmelder var SENSOR14NAME ='Rauchmelder' var SENSOR15 = 'mihome.0.devices.vibration_158d0002b5f8fc.percent'//Vibration1 var SENSOR15NAME ='Vibration 1' var SENSOR16 = 'mihome.0.devices.weather_v1_158d00027898ac.percent' //Humidity Bad var SENSOR16NAME ='Temperatursensor Bad' var SENSOR17 = 'mihome.0.devices.weather_v1_158d0002b534e1.percent' //Humidity Testsensor var SENSOR17NAME ='Temperatursensor Test' var SENSOR18 = 'netatmo.0.Micha.Aussen.BatteryStatus' var SENSOR18NAME ='Netatmo aussen' var SENSOR19 = 'netatmo.0.Micha.Kinderzimmer.BatteryStatus' var SENSOR19NAME ='Netatmo Kinderzimmer' var SENSOR20 = 'netatmo.0.Micha.Schlafzimmer.BatteryStatus' var SENSOR20NAME ='Netatmo Schlafzimmer' var SENSOR21 = 'netatmo.0.Micha.Niederschlagsmesser.BatteryStatus' var SENSOR21NAME ='Netatmo Niederschlagsmesser' var SENSOR1value=Math.round(getState(SENSOR1).val) var SENSOR2value=Math.round(getState(SENSOR2).val) var SENSOR3value=Math.round(getState(SENSOR3).val) var SENSOR4value=Math.round(getState(SENSOR4).val) var SENSOR5value=Math.round(getState(SENSOR5).val) var SENSOR6value=Math.round(getState(SENSOR6).val) var SENSOR7value=Math.round(getState(SENSOR7).val) var SENSOR8value=Math.round(getState(SENSOR8).val) var SENSOR9value=Math.round(getState(SENSOR9).val) var SENSOR10value=Math.round(getState(SENSOR10).val) var SENSOR11value=Math.round(getState(SENSOR11).val) var SENSOR12value=Math.round(getState(SENSOR12).val) var SENSOR13value=Math.round(getState(SENSOR13).val) var SENSOR14value=Math.round(getState(SENSOR14).val) var SENSOR15value=Math.round(getState(SENSOR15).val) var SENSOR16value=Math.round(getState(SENSOR16).val) var SENSOR17value=Math.round(getState(SENSOR17).val) var SENSOR18value=Math.round(getState(SENSOR18).val) var SENSOR19value=Math.round(getState(SENSOR19).val) var SENSOR20value=Math.round(getState(SENSOR20).val) var SENSOR21value=Math.round(getState(SENSOR21).val) schedule ('0 */1 * * *', function(){ console.log('Batterieüberwachung ausgeführt!') if(SENSOR1value
-
Wieso Schande, es funktioniert für dich das ist die Hauptsache.
Damit du es leichter hast deine eigenen Scripte zu warten, als Tip
*codeblöcke entsprechend der {Klammern} einrücken
*KONSTANTEN groß
*variablen klein
Debugausgaben und Kommentare hast du ja schon drin alles gut.
2.script Batteriecheck mit den fix eingetragenen ObjektIDs ist es schwer zu pflegen, wenn man Geräte hinzufügt/austauscht.
Hier mal mein angepasstes script, was ich auch hier aus dem Forum habe. Hab mir angewöht die Quelle immer mit als Kommentar abzulegen. Somit sollte klar sein dass ich mich nicht mit fremden Federn schmücken will. Hoffe mal die Links funktionieren auch noch denn im Februar der Umzug auf die neue Plattform gemacht wurde.
! /**
! Quelle: viewtopic.php?f=21&t=15203&start=20
! Beschreibung: Script zum erfassen von Geräten mit niedrigem Batteriestatus
! Vorbereitung: unter den iobroker.Objekten muss bei den "Batteriestatus-Prozenten" ein sinnvoller Name eingetragen werden,
! um die Geräte zu identifizieren
! todo:
! - Benachrichtigung (in welcher Art auch immer) noch einbauen
! - wenn MiHome-Geräte auf dem DeConz-Stick angelernt sind "KONSTANTEN - Deklaration" anpassen
! **/
! //===================================================================================================================================
! //Datenpunkte erstellen; werden unterhalb von "javascript.0." angelegt.
! createState('monitoring.Batteriestatus.Schwellwert', 15, {type: 'number'}); // ab war die Battereistatus aus krittisch angesehen wird
! createState('monitoring.Batteriestatus.Geraete_Total', 0, {type: 'number'}); // Anzahl der BAtteriegräte
! createState('monitoring.Batteriestatus.Geraete_LowBat', 0, {type: 'number'}); // Anzahl der tatsächlichen LOWBAT
! createState('monitoring.Batteriestatus.Geraete_Namen', " ", {type: 'string'}); // Anzeige der LOWBAT-Geräte, Text s. Vorbereitung
! //===================================================================================================================================
! //KONSTANTEN - Deklaration
! const OID_HOMATIC_BAT = $('hm-rpc.:0.LOWBAT'); //Objekt_IDs für Homatic-Geräte
! const OID_MIHOME_BAT = $('mihome..percent'); //Objekt_IDs für MiHome-Geräte
! //todo: const OID_DECONZ_MIHOME_BAT = $('deconz.*.percent????????'); //Objekt_IDs für MiHome-Geräte an DeConz
! const LOGGEN = true; // = false, wenn kein Logging gewünscht
! //===================================================================================================================================
! //(globale) Variablen - Deklaration
! var arrLowBat;
! //===================================================================================================================================
! //Funktionen
! function fkt_lowbat(id) {
! var name = getObject(id).common.name;
! if(name.indexOf(':0.LOWBAT') != -1) name = name.substring(0, name.indexOf(':0.LOWBAT'));
! arrLowBat.push(name); // Zu Array hinzufügen
! if(LOGGEN) log("Gerät: " + name);
! }
! function fkt_countLowbat() {
! // Setzt die Zähler vor dem Durchlauf aller Elemente .LOWBAT auf 0
! var intGeraete_Total = 0;
! arrLowBat = [];
! / //!!! hier kann ich nicht prüfen ob man auch den Schwellwert abfragen kann da ich keine Homatic-Geräte habe
! OID_HOMATIC_BAT.each(function (id, i) { // Schleife für jedes gefundenen Element *.LOWBAT
! if(getState(id).val) fkt_lowbat(id);
! ++intGeraete_Total; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
! });
! */
! OID_MIHOME_BAT.each(function (id, i) { // Schleife für jedes gefundenen Element .percent
! if(getState(id).val < getState("monitoring.Batteriestatus.Schwellwert").val) fkt_lowbat(id);
! ++intGeraete_Total; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
! });
! // Schleifen sind durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon LOWBAT zutreffend) ausgegeben
! if(LOGGEN) {
! log("Batterie-Geräte (Anzahl): " + intGeraete_Total + " # davon LOWBAT erkannt: " + arrLowBat.length);
! log("Batterie-Geräte (Namen): " + arrLowBat.join(', '));
! }
! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
! setState("monitoring.Batteriestatus.Geraete_Total", intGeraete_Total); // Schreibt die Anzahl der vorhandene Geräte
! setState("monitoring.Batteriestatus.Geraete_LowBat",arrLowBat.length); // Schreibt die Anzahl der LOWBAT-Meldungen
! setState("monitoring.Batteriestatus.Geraete_Namen", arrLowBat.join(',
')); // Schreibt die Namen der Geräte mit LOWBAT Meldung
! }
! //===================================================================================================================================
! //Funktionsaufrufe (main)
! fkt_countLowbat(); //Ausführung bei Skriptstart
! schedule("/60 * * * *", fkt_countLowbat); //Ausführung alle 60 Minuten
telegramm/mail-nachricht kannst ja jetzt selbst einbauen. -
Funktioniert scheinbar noch nicht wie ich es mir gewünscht habe. Zum ersten mal wurde der 60 Minuten Zeitrahmen überschritten und ich hab direkt überalle Alarm gekriegt
Im Telegram sogar 3 mal.. hab ich bestimmt irgendwo ne Klammer falsch gesetzt.