Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. JohannesA

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    J
    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 26
    • Best 2
    • Groups 1

    JohannesA

    @JohannesA

    Starter

    6
    Reputation
    11
    Profile views
    26
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    JohannesA Follow
    Starter

    Best posts made by JohannesA

    • Zigbee-Geräte überwachen

      Hallo liebes Forum!

      Nachdem die Kälte den Zigbee-Temperatursensor im Garten unwissentlich ausser Gefecht gesetzt hatte, habe ich mich daran gesetzt, sowas hinkünftig zu vermeiden.

      Basierend auf das Script zur Überwachung von Zigbee-Geräten von @sebastian0010 (siehe Beitrag hier) habe ich einen umfassenden "Zigbee-Watchdog" gemacht.

      Dieses überwacht sämtliche Geräte auf folgende Parameter:

      a) wie lang liegt der letzte Kontakt zum Coordinator zurück
      b) bei batteriebetriebenen Sensoren/Aktoren wird der Batteriezustand überwacht
      c) die Signalqualität der Funkverbindung abgefragt

      wodurch ich relativ schnell mitbekommen kann, dass ein Sensor ausfällt weil die Batterie plötzlich zusammengebrochen ist und sich nicht langsam entleert hat.

      Die Daten werden dann im JSON-Format in vorgegebenen Datenpunkte gespeichert bzw. "Summen" in Datenpunkte abgelegt. Ich starte dieses Script immer 6 Minuten nach der vollen Stunde und visualisiere die Daten in Jarvis.

      Dieses Script möchte ich hier zur Verfügung stellen - vielleicht kann es ja jemand brauchen.


      Wichtig: Bitte die verbesserte Version von @ciddi89
      aus diesem Beitrag verwenden!

      Originalversion:

      const basePath = "0_userdata.0.Steuerzentrale.ZigbeeWatchdog.";
      const stateDevicesCount = basePath + "devices_count_all";
      const stateDevicesLinkQuality = basePath + "devices_link_quality_list";
      const stateDevicesOfflineCount = basePath + "devices_offline_count";
      const stateDevicesOffline = basePath + "devices_offline_list";
      const stateDevicesWithBatteryCount=basePath + "devices_battery_count";
      const stateDevicesWithBattery=basePath + "devices_battery_list";
      const stateDevicesInfoList=basePath + "devices_list_all";
      const stateDevicesLastCheck=basePath + "lastCheck";
       
       
      async function doStates(){
       
         if (!(await existsStateAsync(stateDevicesCount))) await createStateAsync(stateDevicesCount, 0, { read: true, write: true, desc: "Anzahl Geräte gesamt", name: "Anzahl Geräte gesamt",type: 'number' });
         if (!(await existsStateAsync(stateDevicesLinkQuality))) await createStateAsync(stateDevicesLinkQuality, "", { read: true, write: true, desc: "Liste Geräte Signalstärke", name: "Liste Geräte Signalstärke", type: 'string' });
         if (!(await existsStateAsync(stateDevicesOfflineCount))) await createStateAsync(stateDevicesOfflineCount, 0, { read: true, write: true, desc: "Anzahl Geräte offline", name: "Anzahl Geräte offline",type: 'number' });
         if (!(await existsStateAsync(stateDevicesOffline))) await createStateAsync(stateDevicesOffline, "", { read: true, write: true, desc: "Liste Geräte offline", name: "Liste Geräte offline",type: 'string' });
         if (!(await existsStateAsync(stateDevicesWithBattery))) await createStateAsync(stateDevicesWithBattery, "", {read: true, write: true, desc: "Liste Geräte mit Batterie", name: "Liste Geräte mit Batterie", type: 'string'});
         if (!(await existsStateAsync(stateDevicesWithBatteryCount))) await createStateAsync(stateDevicesWithBatteryCount, 0, {read: true, write: true, desc: "Anzahl Geräte mit Batterie", name: "Anzahl Geräte mit Batterie", type: 'number'});
         if (!(await existsStateAsync(stateDevicesInfoList))) await createStateAsync(stateDevicesInfoList, "", {read: true, write: true, desc: "Liste aller Geräte", name: "Liste aller Geräte", type: 'string'}); 
         if (!(await existsStateAsync(stateDevicesLastCheck))) await createStateAsync(stateDevicesLastCheck, "", {read: true, write: true, desc: "Zeitpunkt letzter Überprüfung", name: "Zeitpunkt letzter Überprüfung", type: 'string'});
       
      }
       
       
       
      function zigbeeWatchdog() {
       
         let maxMinutes = 300; // "Gerät offline" - Wert in Minuten: Gilt erst, wenn Gerät länger als X Minuten keine Meldung gesendet hat 
         let arrOfflineDevices = []; //JSON-Info alle offline-Geräte
         let arrLinkQualityDevices = []; //JSON-Info alle offline-Geräte
         let arrBatteryPowered = []; //JSON-Info alle batteriebetriebenen Geräte
         let arrListAllDevices = []; //JSON-Info Gesamtliste mit Info je Gerät
         let currDeviceString;
         let currDeviceBatteryString;
         let currRoom;
         let deviceName;
         let linkQuality;
         let lastContact;
         let lastContactString;
         let offlineDevicesCount;
         let deviceCounter=0;
         let batteryPoweredCount=0;
         let batteryHealth;
       
         const zigbee = $('zigbee.0.*.link_quality');
       
         zigbee.each(function (id, i) {
             currDeviceString = id.slice(0, (id.lastIndexOf('.') + 1) - 1);
             deviceName=getObject(currDeviceString).common.name
             currRoom = getObject(id, 'rooms').enumNames[0];
             if(typeof currRoom == 'object') currRoom = currRoom.de;
       
       
       
             // 1. Link-Qualität des Gerätes ermitteln
             //---------------------------------------
             
             linkQuality=parseFloat((100/255 * getState(id).val).toFixed(2)) + "%"; // Linkqualität in % verwenden
             //linkQuality=getState(id).val; // ALTERNATIV: Echt-Wert der Linkqualität (0-255) verwenden
             
             arrLinkQualityDevices.push({device: deviceName, room: currRoom, link_quality: linkQuality});
       
       
             // 2. Wann bestand letzter Kontakt zum Gerät
             //------------------------      
             lastContact = Math.round((new Date() - new Date(getState(id).ts)) / 1000 / 60);
             // 2b. wenn seit X Minuten kein Kontakt mehr besteht, nimm Gerät in Liste auf
             //Rechne auf Tage um, wenn mehr als 48 Stunden seit letztem Kontakt vergangen sind
             lastContactString=Math.round(lastContact) + " Minuten";
             if (Math.round(lastContact) > 100) {
                 lastContactString=Math.round(lastContact/60) + " Stunden";
             } 
             if (Math.round(lastContact/60) > 48) {
                 lastContactString=Math.round(lastContact/60/24) + " Tagen";
             } 
             if ( lastContact > maxMinutes) {
                 arrOfflineDevices.push({device: deviceName, room: currRoom, lastContact: lastContactString});
             }
       
             // 3. Batteriestatus abfragen
             currDeviceBatteryString=currDeviceString+".battery";
             if (existsState(currDeviceBatteryString)) {
                 batteryHealth=getState(currDeviceBatteryString).val + "%"; // Batteriestatus in %
                 arrBatteryPowered.push({device: deviceName, room: currRoom, battery: batteryHealth});
             } else batteryHealth="-";
            
         arrListAllDevices.push({device: deviceName, room: currRoom, battery: batteryHealth, lastContact: lastContactString, link_quality: linkQuality});
       
         });
       
       
         // 1b. Zähle, wie viele Zigbee-Geräte existieren
         //---------------------------------------------       
         deviceCounter=arrLinkQualityDevices.length;
             //falls keine Geräte vorhanden sind, passe Datenpunkt-Inhalt der Geräte-Liste an
             if (deviceCounter == 0) { 
                 arrLinkQualityDevices.push({device: "--keine--", room: "", link_quality: ""})
                 arrListAllDevices.push({device: "--keine--", room: "", battery: "", lastContact: "", link_quality: ""});
             }
       
         // 2c. Wie viele Geräte sind offline?
         //------------------------   
         offlineDevicesCount=arrOfflineDevices.length;
             //falls keine Geräte vorhanden sind, passe Datenpunkt-Inhalt der Geräte-Liste an
             if (offlineDevicesCount == 0) { 
                 arrOfflineDevices.push({device: "--keine--", room: "", lastContact: ""})
             }
       
         // 3c. Wie viele Geräte sind batteriebetrieben?
         //------------------------   
         batteryPoweredCount=arrBatteryPowered.length;
             //falls keine Geräte vorhanden sind, passe Datenpunkt-Inhalt der Geräte-Liste an
             if (batteryPoweredCount == 0) { 
                 arrBatteryPowered.push({device: "--keine--", room: "", battery: ""})
             }
       
      /* Optionale Erweiterung, 02. März 2022
          // Sende Benachrichtigungen falls sich die Anzahl der "Offline-Geräte" im Vergleich zur letzten Prüfung erhöht hat.
          // Hinweis: 
          // Der Datenpunkt "SendText2Log" wird bei mir von einem Blockly überwacht, welches bei Änderung den neuen Text per Telegram an mich weiterleitet
       
       let offlineDevicesCountOld = getState(stateDevicesOfflineCount).val;
          if (offlineDevicesCount > offlineDevicesCountOld) {
              //log("Anzahl Geräte hat sich geändert!");
              let infotext = "Folgende " + offlineDevicesCount + " Geräte sind seit einiger Zeit nicht erreichbar: \n";
              for (const id of arrOfflineDevices) {
                  infotext = infotext + "\n" + id["device"] + " " + id["room"] + " (" + id["lastContact"] + ")";
              }
              log(infotext);
              setState("0_userdata.0.LogMessages.SendText2Log", infotext);
              setState("jarvis.0.addNotification", '{"title": "Zigbee-Netzwerk (' + formatDate(new Date(), "DD.MM.YYYY - hh:mm:ss") + ')","message":" ' + offlineDevicesCount + ' Geräte sind nicht erreichbar","display": "drawer"}');
          }
      */
      
         // SETZE STATES
         setState(stateDevicesCount, deviceCounter);
         setState(stateDevicesLinkQuality, JSON.stringify(arrLinkQualityDevices));
         setState(stateDevicesOfflineCount, offlineDevicesCount);
         setState(stateDevicesOffline, JSON.stringify(arrOfflineDevices));
         setState(stateDevicesWithBatteryCount, batteryPoweredCount);
         setState(stateDevicesWithBattery, JSON.stringify(arrBatteryPowered));
         setState(stateDevicesInfoList, JSON.stringify(arrListAllDevices));
         setState(stateDevicesLastCheck, [formatDate(new Date(), "DD.MM.YYYY"),' - ',formatDate(new Date(), "hh:mm:ss")].join(''));
      }
       
      schedule("6 */1 * * *", async function () {
         log("Run Zigbee-Watchdog");
         await doStates().then(zigbeeWatchdog);
      });
       
      setTimeout (async function () {
         log("Run Zigbee-Watchdog");
         await doStates().then(zigbeeWatchdog);
      }, 300);
      
      
      /* Optionale Erweiterung, 2. März 2022
      //Script überprüft an vordefinierten Zeitpunkten den Batteriestand der Zigbee-Geräte  und macht entsprechend meldung, wenn der Batteriestatus unter x% fällt
      // Hinweis: 
      // Der Datenpunkt "SendText2Log" wird bei mir von einem Blockly überwacht, welches bei Änderung den neuen Text per Telegram an mich weiterleitet
      // bei mir passiert dies 3x pro Woche
       
      schedule('{"time":{"exactTime":true,"start":"12:50"},"period":{"days":1,"dows":"[2,4,6]"}}', async function () {
          //log("Anzahl Geräte hat sich geändert!");
          const batteryWarningMin = 75; //Ab wie viel % Rest-Batteriestand soll gewarnt werden?
          let weakCount = 0;
          let batteryData = JSON.parse(getState(stateDevicesWithBattery).val);
          let infotext = "Status Batterien: \n";
          for (const id of batteryData) {
              let batteryValue = id["battery"].replace("%", "");
              if (batteryValue < batteryWarningMin) {
                  infotext = infotext + "\n" + id["device"] + " " + id["room"] + " (" + id["battery"] + ")";
                  ++weakCount;
              }
          }
          log("Batteriezustand: " + infotext);
          if (weakCount > 0) {
              log("Batteriezustand: " + infotext);
              setState("0_userdata.0.LogMessages.SendText2Log", infotext);
              setState("jarvis.0.addNotification", '{"title": "Zigbee-Netzwerk (' + formatDate(new Date(), "DD.MM.YYYY - hh:mm:ss") + ')","message":" ' + weakCount + ' Geräte mit schwacher Batterie","display": "drawer"}');
          } /*else {
              setState("0_userdata.0.LogMessages.SendText2Log", "Batterien der Zigbee-Geräte in Ordnung");
          }*/
      });
      */
      
      


      Theoretisch sollte es "Plug & Play" sein, aber möglicherweise ist es dort und da nicht ganz "rund" oder fehlerfrei gelöst.
      Ich habe erst mit diesem Vorhaben angefangen, mich mit Programmierung zu beschäftigen. 😊

      Ihr Profis hättet dies vermutlich in ein paar Minuten erledigt, für mich war es eine echte Herausforderung! 🙃

      Aja, vielen Dank an alle für die tolle Arbeit hier und an alle bei denen ich abgekupfert und anhand deren Scripten ich ein bisschen was gelernt hab.

      Liebe Grüße

      Johannes

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu
      Wow, vielen Dank für das Angebot! 🙂

      Ich möchte dich aber jetzt nicht mit was beschäftigen das ich mir mal als "ToDo" in den Kopf gesetzt hab.
      -> Ursprünglich war ja nur die Frage nach einer "kompakteren Darstellung" für meine drei Steuer-Buttons in Form des Blinds. 😄 Zufrieden war ich ja vorher schon. 😄 Darum hatte das auch nicht die Prio.

      Ausserdem hat mich gerade die Motivation gepackt. 🤔

      Darf ich da deines Scripts bedienen und mich da selber mal dran versuchen - und dich notfalls zu Hilfe rufen? 😊

      Seit mein Script zur Überwachung von Zigbee-Geräten fertig ist und durch die ioBroker-Community verbessert wurde, hab ich eh in dieser Richtung nichts mehr getan.
      Schadet sicher nicht, wieder was dazuzulernen. 😄 Und sonst würde ich gegen ein Sixpack via PayPal auf dein Angebot zurückkommen.

      posted in JavaScript
      J
      JohannesA

    Latest posts made by JohannesA

    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @MCU
      Aber nochmal frech nachgefragt, weil die Frage eigentlich nicht beantwortet wurde:
      Ist es möglich das Blind in Jarvis so zu modifizieren und für meinen aktuellen Bedarf anzupassen?

      Generell wäre es cool, in Jarvis "Buttons" nebeineinander setzen zu können. 😄

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu
      Wow, vielen Dank für das Angebot! 🙂

      Ich möchte dich aber jetzt nicht mit was beschäftigen das ich mir mal als "ToDo" in den Kopf gesetzt hab.
      -> Ursprünglich war ja nur die Frage nach einer "kompakteren Darstellung" für meine drei Steuer-Buttons in Form des Blinds. 😄 Zufrieden war ich ja vorher schon. 😄 Darum hatte das auch nicht die Prio.

      Ausserdem hat mich gerade die Motivation gepackt. 🤔

      Darf ich da deines Scripts bedienen und mich da selber mal dran versuchen - und dich notfalls zu Hilfe rufen? 😊

      Seit mein Script zur Überwachung von Zigbee-Geräten fertig ist und durch die ioBroker-Community verbessert wurde, hab ich eh in dieser Richtung nichts mehr getan.
      Schadet sicher nicht, wieder was dazuzulernen. 😄 Und sonst würde ich gegen ein Sixpack via PayPal auf dein Angebot zurückkommen.

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu

      Wenn man die Button klickt, wie lange braucht er dann um darauf zu reagieren? Bei STOP stoppt er sofort?

      Puh. Gute Frage, reagiert eigentlich recht akkurat, ein paar Millisekunden werden es vermutlich sein. Auch wenn ich in ioBroker draufdrücke.
      Aber zwischen zwei Befehlen (z.B. runter->stop) vergeht etwa eine gefühlte Sekunde, weil (glaub ich) der SignalDuino oder FHEM zwischen den Befehlen eine kurze Pause einbaut und die Signale der Reihe nach absetzt.

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu

      Himmelsrichtungen gewünscht?

      Langsam. Einen Schritt nach dem anderen. 😄
      Bin gerade an meine Grenzen gestoßen. 🤔

      Aber (und ja, ich bin an einem Script schon zerbrochen weil ich "=" anstatt "==" getippt hatte, deswegen entschuldige falls ich es falsch interpretiere):

      Hier wird davon ausgegangen, dass die Jalousie aktiv den Status meldet, bzw. gezielt den Zielstatus verarbeiten kann. Das ist ja bei mir nicht der Fall. Ich würde/müsste da eben ganz gezielt "auf / zu / stop" drücken (auslösen).

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      Mensch bin ich doof.
      Das Blind geht ja den umgekehrten Weg. Man setzt die Zielposition und im Hintergrund fährt die Jalousie dorthin? Oder?

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu
      Das ist ja cool!
      Versteh aber das meiste des Quellcodes grad nicht. 😕 Da fehlt mir leider das Kaliber und muss mich in das Thema erst noch viel mehr einlernen.

      Aber meine Datenpunkte müsste ich trotzdem anders aufbauen, damit ich das Blind nutzen kann, oder? Darum gehts mir ja hauptsächlich. Die Position seh ich jetzt ja auch nur wenn ich raus schau. 😄

      posted in JavaScript
      J
      JohannesA
    • RE: HowTo: Zusatz-Programme fuer jarvis v3

      @mcu said in HowTo: Zusatz-Programme fuer jarvis v3:

      den Ablauf erkennen kann, wo sich welche Zustände ändern.
      Wie lange dauert eine komplette Fahrt von oben bis unt

      Ich versuch mal es kurz zu beschreiben:

      Die Laufzeit beim Öffnen sind um die 65 Sekunden, die kleinen Fenster sind natürlich schneller als die Terrassentür.

      Ich bekomm aus Fhem über den Adapter eben die drei Datenpunkte (off=auf/on=zu/stop) und weitere in ioBroker zur Verfügung gestellt, was ja im Prinzip der 433MHz-Fernbedienung entspricht, die ja auch nur die drei Tasten hat. (Die Zusatz-Datenpunkte kommen daher, da das Fhem-Modul eigentlich für einen anderen Hersteller (Dooya) ausgelegt ist und zweckentfremdet wird)

      Drücke ich nun im ioBroker auf den Button, übergibt der FHEM-Adapter diese Anweisung an Fhem. FHEM kümmert sich dann darum, dass der SignalDuino ein entsprechendes Signal aussendet, und die Jalousie sich bewegt. Hier simuliert der SignalDuino also die Fernbedienung. Die Jalousie fährt dann so lange in die vorgegebene Richtung bis der End-Schalter erreicht ist oder ich eben "Stop" drücke.

      Das Erreichen des Endschalters meldet die Jalousie aber nicht zurück.

      (Mein Plan ist fürs erste dass ich automatisch "beschatten" kann. Also ca. 50% geschlossen. Das hätte ich halt mit Script oder Blockly gelöst, dass ich z.B. erstmal 90 Sekunden hoch fahre, dann runter und nach 35 Sekunden mit "stop" auf halber Höhe abstelle. So könnte FHEM (oder ich selber mittels Script in ioBroker) auch die aktuelle Position über Timer kalulieren. Ist aber eine andere Baustelle. 😄 )

      Ich hoffe das geht jetzt nicht am Thema deiner Frage vorbei.
      Mit FHEM hab ich mich dahingehend zu wenig beschäftigt. Als das mit den Jalousien funktioniert hat, war kein weiterer Bedarf gegeben. Es gehört für mich halt zum SignalDuino dazu. 😄

      posted in JavaScript
      J
      JohannesA
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Also so schaut die Datenpunkt-Liste je Jalousie aus:
      FHEM-DP.PNG

      Hier heißen sie aber "off/on/stop" - hab das mit Alias umgeleitet, damit es für mich leichter verständlich ist.

      Die Position wird im moment noch gar nicht befüllt - da muss ich mich erst nochmal mit FHEM beschäftigen. Der Wert wird (so hab ich das verstanden) nur aus den Laufzeiten errechnet, weil meine Jalousie leider zu doof ist und keinen Stand zurückmeldet. Ebenso wie die anderen Datenpunkte die da angbliche Positionen liefern. Die 37 hab ich mal händisch eingetragen weils ein "ToDo" für mich ist. 🙂

      Und aus diesen Vorgaben heraus hab ich halt da was gebastelt. 😄 Das Dooya-Modul ist in Fhem halt auch nur eine Krücke für meine Jalousien, funktioniert aber und das Ergebnis passt.

      posted in Tester
      J
      JohannesA
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Meine Jalousien sind eine etwas eigenwillige Sache:
      Es sind Jarolift-Rohrmotoren verbaut und die werden mit 433MHz angefunkt.

      Im Hintergrund kommuniziert FHEM über einen Signalduino mit den Jalousien und stellt mir eben über den FHEM-Adapter die dooya-Datenpunkte (auf/stop/zu und andere) zur Verfügung.

      So war es für mich relativ einfach, da ich mit simplen Blocklys halt "Bindings" erstellen konnte, egal ob das der Zigbee-Taster oder eben die Visualisierung ist, die die Jalousien dann ansteuert.

      Soweit ich diese Blinds verstehe, müsste ich da ja im Hintergrund mit einem Script die Werte entsprechend umschlüsseln, oder? Puh. Das ist halt nicht meine Stärke. 😄

      posted in Tester
      J
      JohannesA
    • RE: jarvis v3.0.0 - just another remarkable vis

      Gibt es eine Möglichkeit, die "BlindLevelAction" so zu modifizieren, sodass ich jeden Button separat einen Zieldatenpunkt zuweisen kann welche dann geschaltet bzw. angezeigt werden?

      Ich hab das mal skizziert:
      (links wäre die benötigte Zuweisung der Datenpunkte,
      rechts stellt dar, wie ich das zur Zeit als "StateList" gelöst hab.)

      BlindLevel.JPG

      Ein BlindLevel-Element wär da natürlich schöner, effizienter und platzsparender.
      Also so in etwa:
      Zieldarstellung.JPG

      Vielen Dank!

      LG Johannes

      posted in Tester
      J
      JohannesA
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo