NEWS
Servicemeldungen in vis
-
@chka: Versuche mal bitte folgendes (so helfe ich mir immer)
-
das Objekt editieren
-
den Schreib-Modus aktivieren
-
als Wert true oder false eintragen
-
den Schreib-Modus wieder deaktivieren
Problem ist nicht das fehlende Objekt, sondern der null-Wert des Objekts.
Allgemein: Das Skript erzeugt nach einem Neustart des Adapters massenhaft events bzgl. "unreachable". Das mag bei 30,40 Geräten noch kein Problem sein; bei mir hängen aber fast 170 HM Geräte an der CCU. Ich bekomme dann immer eine "You are sending too fast" Meldung. Lösung hab ich allerdings auch nicht.
-
-
Wird das nicht beim neu scannen der Geräte wieder überschrieben?
-
hab ich nicht beobachtet
-
ich hab auch das Problem mit den Warmeldungen, dass der State nicht gefunden wurde (erst seit javascript update) Das problem ist nicht der wert Null. Sonder die Abfrage des States der cuxd Geräte. der Unterpunkt 0.XXX Schein einfach nicht da zu sein obwohl er unter Objekte aufgeführt ist. Weiß jemand wie man die die cuxd Geräte von der Abfrage entkoppeln kann? Finde es irgendwie nciht so toll wenn mein gesamter log immer gelb ist
-
Hallo zusammen,
seit einigen Tagen funktioniert das Script bei mir leider nicht mehr (keine Änderung am System - nur Update der Adapter in Iobroker.
Es stehen bei mir immer diesselben Geräte als "unreach" drin, obwohl der Status korrekt ist bzw. es keine Servicemeldungen gibt (oder andere).
Das Log beim Start des Scriptes sieht so aus:
Log 21:43:00.898 [info] javascript.0 Stop script script.js.common.Servicemeldungen 21:43:01.157 [info] javascript.0 Start javascript script.js.common.Servicemeldungen 21:43:01.158 [warn] javascript.0 at count (script.js.common.Servicemeldungen:39:22) 21:43:01.158 [warn] javascript.0 at script.js.common.Servicemeldungen:47:9 21:43:01.158 [warn] javascript.0 at script.js.common.Servicemeldungen:51:22 21:43:01.159 [warn] javascript.0 at count (script.js.common.Servicemeldungen:39:22) 21:43:01.159 [warn] javascript.0 at script.js.common.Servicemeldungen:59:9 21:43:01.159 [info] javascript.0 script.js.common.Servicemeldungen: Homematic-Servicemeldungen: hm-rpc.0.KEQ0509324.0.UNREACH, hm-rpc.0.KEQ0510087.0.UNREACH, hm-rpc.0.KEQ0510208.0.UNREACH, hm-rpc.0.KEQ0576159.0.UNREACH, hm-rpc.0.KEQ1039611.0.UNREACH, hm-rpc.0.LEQ0420281.0.UNREACH, hm-rpc.0.NEQ1662995.0.UNREACH, 21:43:01.160 [info] javascript.0 script.js.common.Servicemeldungen: Anzahl Homematic-Servicemeldungen: 7 21:43:01.160 [info] javascript.0 script.js.common.Servicemeldungen: registered 455 subscriptions and 1 schedule
Kann mir jemand einen Tip geben, woran das liegen könnte?
Ich nutze das Script hier aus dem Thread und es hat bislang problemlos funktioniert.
/* System Homematic Servicemeldungen Skript erstellt Variablen Service.Homematic.* http://forum.iobroker.org/viewtopic.php?f=21&t=914#p9153 erstellt: 04.08.2015 von paul53 angepasst von pix 05.10.2015 STICKY UNREACH wird jetzt auf true gesetzt und damit gelöscht http://forum.iobroker.org/viewtopic.php?f=21&t=914&p=9200&hilit=sticky#p9173 04.02.2016 Instanz Variable */ instanz = 'javascript.0.'; // Service Meldungen createState('Servicemeldungen.Homematic.Anzahl', 0, { name: 'Homematic Servicemeldungen Anzahl', desc: 'Zahl der Homematic Servicemeldungen', type: 'number' }); createState('Servicemeldungen.Homematic.Text', "", { name: 'Homematic Servicemeldungen Text', desc: 'Liste der Geräte, die Servicemeldungen produzieren', type: 'string' }); var idAnzahl = instanz + 'Servicemeldungen.Homematic.Anzahl', idText = instanz + 'Servicemeldungen.Homematic.Text'; var SelectorUNREACH = $('channel[state.id=*.UNREACH]'); var SelectorSTICKY_UNREACH = $('channel[state.id=*.STICKY_UNREACH]'); var SelectorLOWBAT = $('channel[state.id=*.LOWBAT]'); var SelectorCONFIG_PENDING = $('channel[state.id=*.CONFIG_PENDING]'); function countService(obj) { var anzahl = 0; var text = ""; function count(id) { var status = getState(id).val; // Zustand abfragen (jedes Element) if (status) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt text = text + id + ", "; // Zu String hinzufügen ++anzahl; // Zählt die Anzahl der Service-Alarme } } SelectorUNREACH.each(function (id, i) { count(id); }); SelectorSTICKY_UNREACH.each(function (id, i) { var status = getState(id).val; // Zustand abfragen (jedes Element) if (status) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt log('STICKY_UNREACH Meldung: ' + id + ' wurde auf <true> gesetzt. Das Homematic Gerät ist wieder uneingeschränkt erreichbar.'); setState(id, false); // STICKY_UNREACH werden gelöscht } }); SelectorLOWBAT.each(function (id, i) { count(id); }); SelectorCONFIG_PENDING.each(function (id, i) { count(id); }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon Service zutreffend) ausgegeben log("Homematic-Servicemeldungen: " + text); log("Anzahl Homematic-Servicemeldungen: " + anzahl); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert if (!anzahl) { text = "keine Servicemeldungen"; } setState(idText, text); // Schreibt die IDs der Datenpunkte mit Service Meldung setState(idAnzahl, anzahl); // Schreibt die aktuelle Anzahl der Service Meldungen } SelectorUNREACH.on(function(obj) { // bei Zustandänderung *.UNREACH in allen Gewerken countService(obj); }); SelectorSTICKY_UNREACH.on(function(obj) { // bei Zustandänderung *.STICKY_UNREACH in allen Gewerken countService(obj); }); SelectorLOWBAT.on(function(obj) { // bei Zustandänderung *.LOWBAT in allen Gewerken countService(obj); }); SelectorCONFIG_PENDING.on(function(obj) { // bei Zustandänderung *.CONFIG_PENDING in allen Gewerken countService(obj); }); // alternative Abfrage jede Minute schedule("*/15 * * * *", function () { countService(); }); // Ausführung bei Scriptstart countService();</true>
Oder ist das ein allgemeiner Fehler?
Danke im Voraus
Frank
-
Hallo nochmals,
ist wirklich keiner da, der mir hier evtl. weiterhelfen kann und bin ich der einzige, bei dem dieses Problem besteht?
Im Übrigen zeigt es bei mir auch seit längerem schon nur noch die Seriennummer des Gerätes an und keine ID (Name) mehr.
Und somit weiß ich natürlich nie, welches Gerät gerade nicht erreichbar ist etc…
Wäre toll, wenn mir jemand nen Tipp hat, wo ich da nach dem Fehler suchen könnte...
Vielen Dank und schöne Weihnachten
Frank
-
unreach: schau mal in die Objekte und setze für die betroffenen Geräte den "STICKY_UNREACH" Status auf "false".
ID anstatt Name:
Ändere in````
function count(id)die Zeile
text = text + id + ",
";gegen
text = text + getObject(id).common.name+ ",
"; -
Noch ein Variante mit geringfügigen Änderungen,
1. Ausgabe für Telegram formatiert
2. Statt der ID werden die Namen der Homematic Geräte ausgegeben
3. Abfrage des Konfigurationsstatus und des Stick_Unreach Bits habe ich weggelassen, weil für mich nicht so relevant.
instanz = 'javascript.0.'; var idAnzahl = instanz + 'Servicemeldungen.Homematic.Anzahl', idText = instanz + 'Servicemeldungen.Homematic.Text'; createState(idAnzahl, 0, { name: 'Homematic Servicemeldungen Anzahl', desc: 'Zahl der Homematic Servicemeldungen', type: 'number' }); createState(idText, "", { name: 'Homematic Servicemeldungen Text', desc: 'Liste der Geräte, die Servicemeldungen produzieren', type: 'string' }); var SelectorUNREACH = $('channel[state.id=*.UNREACH]'); var SelectorLOWBAT = $('channel[state.id=*.LOWBAT]'); function countService(obj) { var anzahl = 0; var text = ""; var delimiter = ""; // Klartext Name ermitteln function getname(id) { var tokens = []; var object = getObject(id); tokens = object.common.name.split(":"); return tokens[0]; } function count(id,cause) { var status = getState(id).val; if (status) { text = text + delimiter + getname(id) + " " + cause + " " ; delimiter = "\n"; // Neue Zeile für Telegram ++anzahl; } } SelectorUNREACH.each(function (id, i) {count(id,"ist nicht erreichbar");}); SelectorLOWBAT.each(function (id, i) {count(id,"hat schwache Batterie");}); if (!anzahl) text = "keine Servicemeldungen"; log("Homematic-Servicemeldungen: " + text); //log("Anzahl Homematic-Servicemeldungen: " + anzahl); setState(idText, text); setState(idAnzahl, anzahl); setState('telegram.0.communicate.response', text); } countService(); SelectorUNREACH.on(function(obj) {countService(obj);}); SelectorLOWBAT.on(function(obj) {countService(obj);});
-
Hallo zusammen,
würde gerne zu den Service Meldungen auch noch einige Meldungen anzeigen lassen.
Im Moment habe ich für jede Meldung ein eigenes Feld in VIS, dass dann entspr. angezeigt wird, wenn es akut ist.
Das kostet aber viel Platz, da für jede Meldung ein eigener Platz reserviert wird.
Besser wäre es eben das mit den Servicemeldungen zu verbinden, die dann entsprechend von oben beginnen nach unten rutschen.
Eigene Meldungen wären z.B. Wasser zu kalt/heiß, Luftfeuchtigkeit zu hoch, Fenster geschlossen halt, etc. D.h. ich lasse etwas anzeigen, wenn ein Wert unter/überschritten wird.
Wäre cool, wenn man das irgendwie mit einbinden könnte.
Danke für Tipps
-
-
Multi Ereignis ist nicht das richtige, da hier die Servicemeldungen meines Wissens fehlen würde.
Ich habe die eigenen Meldungen als Alarmmeldung nun in der CCU2. Wie bekomme ich das zusammen mit den Servicemeldungen angezeigt?
-
Hallo nochmal,
es geht noch einmal darum Alarmmeldungen ebenso anzuzeigen.
Im Grunde genommen also alles was mit "Alarm_" beginnt und state.enabled auf "true" steht als Text eintragen.
var SelectorALARM = …...................
Keine Ahnung was ich da eintragen muss.
-
Sorry vielleicht eine etwas doofe Frage aber ich Blicke nicht ganz durch. Ich habe die Servicemeldungen so implementiert wie von dir beschrieben, jedoch wird mir der Text nun in voller Länge ausgegeben und passt somit nicht auf den Bildschirm bei mehreren Fehlermeldungen:
Wie kann ich nun einen Zeilenumbruch realisieren, damit jeder Fehler auf eine neue Zeile geschrieben wird, ohne Komma?
Vielen Dank für deine Anleitung, diese hat mir sehr geholfen obwohl bei deinem Script das </true> am Ende mir einige Nerven beim kompilieren gekostet hat
-
Dein Script für Telegram ist perfekt und funktioniert auch, vielen Dank dafür.
Hätte nur eine Frage, was muss man machen, damit bei der Meldung "keine Servicemeldungen" kein Telegram verschickt wird, sondern das ich nur eine Telegram bekomme wenn wirklich eine Meldung da ist?Danke im Voraus.
-
@nik82 auf !anzahl abfragen und den entsprechenden setState() Befehl überspringen.
-
Danke für deine schnelle Rückmeldung, aber ich hab von Javascript leider kein Plan, bin Blockly-Verblödet
Kannst du mir etwas genauere Infos geben, sorry ... -
Habe jetzt ein wenig "gebastelt".
Was ich möchte: Wenn eine Servicemeldung vorhanden ist, dann soll mir einmal am Tag eine Email geschickt werden, ansonsten soll nichts passieren.
Habe es nun die Telegram Zeile rausgenommen und dafür eine Abfrage eingebaut.
Also dieses Script klappt zumindest, ich glaube aber das es nicht gerade "sauber" ist, weil auch im Log Warnmeldungen kommen, vielleicht kann sich das ja noch ein Profil anschauen
instanz = 'javascript.0.'; var idAnzahl = instanz + 'Servicemeldungen.Homematic.Anzahl', idText = instanz + 'Servicemeldungen.Homematic.Text'; createState(idAnzahl, 0, { name: 'Homematic Servicemeldungen Anzahl', desc: 'Zahl der Homematic Servicemeldungen', type: 'number' }); createState(idText, "", { name: 'Homematic Servicemeldungen Text', desc: 'Liste der Geräte, die Servicemeldungen produzieren', type: 'string' }); var SelectorUNREACH = $('channel[state.id=*.UNREACH]'); var SelectorLOWBAT = $('channel[state.id=*.LOWBAT]'); function countService(obj) { var anzahl = 0; var text = ""; var delimiter = ""; // Klartext Name ermitteln function getname(id) { var tokens = []; var object = getObject(id); tokens = object.common.name.split(":"); return tokens[0]; } function count(id,cause) { var status = getState(id).val; if (status) { text = text + delimiter + getname(id) + " " + cause + " " ; delimiter = "\n"; // Neue Zeile für Telegram ++anzahl; } } SelectorUNREACH.each(function (id, i) {count(id,"ist nicht erreichbar");}); SelectorLOWBAT.each(function (id, i) {count(id,"hat schwache Batterie");}); if (!anzahl) text = "keine Servicemeldungen"; log("Homematic-Servicemeldungen: " + text); //log("Anzahl Homematic-Servicemeldungen: " + anzahl); setState(idText, text); setState(idAnzahl, anzahl); var timeout; timeout = setTimeout(function () { if (getState("javascript.0.Servicemeldungen.Homematic.Anzahl").val >= 1) { sendTo("email@adresse.de", "send", { text: getState("javascript.0.Servicemeldungen.Homematic.Text").val, to: 'email', subject: 'Homematic Servicemeldungen!' }); } }, 10000); } countService(); SelectorUNREACH.on(function(obj) {countService(obj);}); SelectorLOWBAT.on(function(obj) {countService(obj);});
-
schön, dass es klappt.
-
@Marty56
Habe noch ein Problem, ich bekomme keine Meldung wenn ein Batteriestand niedrig ist:Ich habe momentan zwei Fehler drin:
Iobroker erkennt auch das die Batterie niedrig ist:
Aber es zeigt mir unter Anzahl nur eine Servicemeldung an und da nur meine Garten-Bewässerung:
Hast du da eine Lösung warum das bei mir nicht klappt?
Danke im Voraus.
-
Nimm mal das dazu im Skript , unter Zeile 17
var SelectorLOWBAT = $('channel[state.id=*.LOW_BAT]');