Navigation

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

    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

    T
    • Profile
    • Following 1
    • Followers 0
    • Topics 12
    • Posts 80
    • Best 9
    • Groups 1

    TomTom24

    @TomTom24

    Starter

    15
    Reputation
    17
    Profile views
    80
    Posts
    0
    Followers
    1
    Following
    Joined Last Online

    TomTom24 Follow
    Starter

    Best posts made by TomTom24

    • Hilfreiche Scripte z.b. Farben nach Prozente

      Für alle, die ein bisschen JS brauchen können.
      Hier ein paar globale Funktionen:

      Übergabe von Stunden in Dezimal - Rückgabe von Stunden und Minuten

      function dezimaleStundenInStundenUndMinuten(dezimaleStunden) {
          // Berechne die Gesamtzahl der Minuten
          const gesamtMinuten = dezimaleStunden * 60;
      
          // Extrahiere die Stunden (Ganzzahlanteil)
          const stunden = Math.floor(dezimaleStunden);
      
          // Extrahiere die Minuten (Nachkommateil)
          const minuten = Math.round((dezimaleStunden - stunden) * 60);
      
          // Füge führende Nullen hinzu
          const stundenMitNullen = stunden < 10 ? `0${stunden}` : stunden;
          const minutenMitNullen = minuten < 10 ? `0${minuten}` : minuten;
      
          return `${stundenMitNullen}:${minutenMitNullen}h`;
      }
      

      Um in Abhängigkeit von der % Zahl einen Wert zurückzubekommen von rot /niedrig zu grün /hoch

      function getColorByPercentage_redtogreen(percentage) {
          // Stellen Sie sicher, dass der Wert zwischen 0 und 100 liegt
          percentage = Math.max(0, Math.min(100, percentage));
      
          // Berechnen Sie die RGB-Werte für den Farbverlauf
          const red = Math.floor(255 * (1 - percentage / 100));
          const green = Math.floor(255 * (percentage / 100));
          const blue = 0;
      
          // Konvertieren Sie die RGB-Werte in einen hexadezimalen Farbcode
          const colorCode = `#${red.toString(16).padStart(2, '0')}${green.toString(16).padStart(2, '0')}00`;
      
          return colorCode;
      }
      

      Hier gibt es einen Farbwert nach Wert zurück - Farbwerte müsst ihr Euch noch anpassen:

      function getColorByValue_Verbrauch(value) {
          if (value === 0) {
              return "#808080"; // Grau
          } else if (value > 0) {
              return "#29fc11"; // Grün
          } else {
              return "#ff0024"; // Rot
          }
      }
      
      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • Smartdisplay mit Wetter

      Hi,
      Hier mal mein kleines Projekt. Das Display wird mit Python angesteuert.
      Verwendet wurde ein Raspberry Zero WH und ein Waveshare eink 7.5 Zoll 3farbig. Kostenpunkt ca. 100€ inkl. Bilderrahmen (18x13).

      Die Daten kommen alle aus dem iobroker mit folgenden Adaptern:

      • E3DC
      • Solar Wetter
      • OpenWeatherMap

      Die anderen Daten habe ich berechnet und sind als Datenpunkte bei mir im IOB.

      IMG_5342.jpeg IMG_5343.jpeg

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: Test Adapter e3dc-rscp v0.0.x GitHub

      @alf4711
      Monat:

      <block xmlns="https://developers.google.com/blockly/xml" type="procedures_defcustomnoreturn" id="%#tUT(}GBUjdh)-UQ!*X" x="238" y="188">
        <mutation statements="false"></mutation>
        <field name="NAME">etwas tun</field>
        <field name="SCRIPT">Y29uc3QgaGV1dGUgPSBuZXcgRGF0ZSgpOw0KLy8gNyBUYWdlIHp1csO8Y2sNCi8vY29uc3QgaGV1dGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApOw0KY29uc3QgdGFnID0gU3RyaW5nKGhldXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsNCmNvbnN0IG1vbmF0ID0gU3RyaW5nKGhldXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBKYW51YXIgaXN0IDAhDQpjb25zdCBqYWhyID0gaGV1dGUuZ2V0RnVsbFllYXIoKTsNCi8vMjAyNC0wMi0yMiAwMDowMDowMC4wMDANCmNvbnN0IGZvcm1hdGllcnRlc0RhdHVtID0gYCR7amFocn0tJHttb25hdH0tJHt0YWd9IDAwOjAwOjAwLjAwMGA7DQovL3NldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfREFZLlRJTUVfU1RBUlQiLGZvcm1hdGllcnRlc0RhdHVtKTsNCnNldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfTU9OVEguVElNRV9TVEFSVCIsYCR7amFocn0tJHttb25hdH0tMDEgMDA6MDA6MDAuMDAwYCk7IA0KLy9zZXRTdGF0ZSgiZTNkYy1yc2NwLjAuREIuSElTVE9SWV9EQVRBX1dFRUsuVElNRV9TVEFSVCIsYCR7amFocn0tJHttb25hdH0tJHt0YWd9IDAwOjAwOjAwLjAwMGApOw0KLy8gc2V0U3RhdGUoImUzZGMtcnNjcC4wLkRCLkhJU1RPUllfREFUQV9ZRUFSLlRJTUVfU1RBUlQiLGAke2phaHJ9LTAxLTAxIDAwOjAwOjAwLjAwMGApOw0KLy8gY29uc29sZS5sb2coZm9ybWF0aWVydGVzRGF0dW0pOw==</field>
        <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
      </block>
      

      Jahr

      <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="schedule" id="c/UFAhN}fN-kQy3NE5rk" x="113" y="37">
          <field name="SCHEDULE">*/60 * * * *</field>
          <statement name="STATEMENT">
            <block type="procedures_callcustomnoreturn" id="4N*g)ftax/0G!p44$%0O">
              <mutation name="etwas tun"></mutation>
            </block>
          </statement>
        </block>
        <block type="procedures_defcustomnoreturn" id="%#tUT(}GBUjdh)-UQ!*X" x="238" y="188">
          <mutation statements="false"></mutation>
          <field name="NAME">etwas tun</field>
          <field name="SCRIPT">Y29uc3QgaGV1dGUgPSBuZXcgRGF0ZSgpOw0KLy8gNyBUYWdlIHp1csO8Y2sNCi8vY29uc3QgaGV1dGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApOw0KY29uc3QgdGFnID0gU3RyaW5nKGhldXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsNCmNvbnN0IG1vbmF0ID0gU3RyaW5nKGhldXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBKYW51YXIgaXN0IDAhDQpjb25zdCBqYWhyID0gaGV1dGUuZ2V0RnVsbFllYXIoKTsNCi8vMjAyNC0wMi0yMiAwMDowMDowMC4wMDANCmNvbnN0IGZvcm1hdGllcnRlc0RhdHVtID0gYCR7amFocn0tJHttb25hdH0tJHt0YWd9IDAwOjAwOjAwLjAwMGA7DQovL3NldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfREFZLlRJTUVfU1RBUlQiLGZvcm1hdGllcnRlc0RhdHVtKTsNCi8vc2V0U3RhdGUoImUzZGMtcnNjcC4wLkRCLkhJU1RPUllfREFUQV9NT05USC5USU1FX1NUQVJUIixgJHtqYWhyfS0ke21vbmF0fS0wMSAwMDowMDowMC4wMDBgKTsgDQovL3NldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfV0VFSy5USU1FX1NUQVJUIixgJHtqYWhyfS0ke21vbmF0fS0ke3RhZ30gMDA6MDA6MDAuMDAwYCk7DQogc2V0U3RhdGUoImUzZGMtcnNjcC4wLkRCLkhJU1RPUllfREFUQV9ZRUFSLlRJTUVfU1RBUlQiLGAke2phaHJ9LTAxLTAxIDAwOjAwOjAwLjAwMGApOw0KLy8gY29uc29sZS5sb2coZm9ybWF0aWVydGVzRGF0dW0pOw==</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
      </xml>
      

      letzten 7 Tage

      <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="schedule" id="c/UFAhN}fN-kQy3NE5rk" x="113" y="37">
          <field name="SCHEDULE">*/60 * * * *</field>
          <statement name="STATEMENT">
            <block type="procedures_callcustomnoreturn" id="4N*g)ftax/0G!p44$%0O">
              <mutation name="etwas tun"></mutation>
            </block>
          </statement>
        </block>
        <block type="procedures_defcustomnoreturn" id="%#tUT(}GBUjdh)-UQ!*X" x="238" y="188">
          <mutation statements="false"></mutation>
          <field name="NAME">etwas tun</field>
          <field name="SCRIPT">Ly9jb25zdCBoZXV0ZSA9IG5ldyBEYXRlKCk7DQovLyA3IFRhZ2UgenVyw7xjaw0KY29uc3QgaGV1dGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApOw0KY29uc3QgdGFnID0gU3RyaW5nKGhldXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsNCmNvbnN0IG1vbmF0ID0gU3RyaW5nKGhldXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBKYW51YXIgaXN0IDAhDQpjb25zdCBqYWhyID0gaGV1dGUuZ2V0RnVsbFllYXIoKTsNCi8vMjAyNC0wMi0yMiAwMDowMDowMC4wMDANCmNvbnN0IGZvcm1hdGllcnRlc0RhdHVtID0gYCR7amFocn0tJHttb25hdH0tJHt0YWd9IDAwOjAwOjAwLjAwMGA7DQovL3NldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfREFZLlRJTUVfU1RBUlQiLGZvcm1hdGllcnRlc0RhdHVtKTsNCi8vc2V0U3RhdGUoImUzZGMtcnNjcC4wLkRCLkhJU1RPUllfREFUQV9NT05USC5USU1FX1NUQVJUIixgJHtqYWhyfS0ke21vbmF0fS0ke3RhZ30gMDA6MDA6MDAuMDAwYCk7IA0Kc2V0U3RhdGUoImUzZGMtcnNjcC4wLkRCLkhJU1RPUllfREFUQV9XRUVLLlRJTUVfU1RBUlQiLGAke2phaHJ9LSR7bW9uYXR9LSR7dGFnfSAwMDowMDowMC4wMDBgKTsNCi8vIHNldFN0YXRlKCJlM2RjLXJzY3AuMC5EQi5ISVNUT1JZX0RBVEFfWUVBUi5USU1FX1NUQVJUIixgJHtqYWhyfS0wMS0wMSAwMDowMDowMC4wMDBgKTsNCi8vIGNvbnNvbGUubG9nKGZvcm1hdGllcnRlc0RhdHVtKTs=</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
      </xml>
      

      Aktueller Tag

      <xml xmlns="https://developers.google.com/blockly/xml">
        <block type="schedule" id="c/UFAhN}fN-kQy3NE5rk" x="113" y="37">
          <field name="SCHEDULE">*/15 * * * *</field>
          <statement name="STATEMENT">
            <block type="procedures_callcustomnoreturn" id="4N*g)ftax/0G!p44$%0O">
              <mutation name="etwas tun"></mutation>
            </block>
          </statement>
        </block>
        <block type="procedures_defcustomnoreturn" id="%#tUT(}GBUjdh)-UQ!*X" x="238" y="188">
          <mutation statements="false"></mutation>
          <field name="NAME">etwas tun</field>
          <field name="SCRIPT">Y29uc3QgaGV1dGUgPSBuZXcgRGF0ZSgpOw0KY29uc3QgdGFnID0gU3RyaW5nKGhldXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsNCmNvbnN0IG1vbmF0ID0gU3RyaW5nKGhldXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBKYW51YXIgaXN0IDAhDQpjb25zdCBqYWhyID0gaGV1dGUuZ2V0RnVsbFllYXIoKTsNCi8vMjAyNC0wMi0yMiAwMDowMDowMC4wMDANCmNvbnN0IGZvcm1hdGllcnRlc0RhdHVtID0gYCR7amFocn0tJHttb25hdH0tJHt0YWd9IDAwOjAwOjAwLjAwMGA7DQpzZXRTdGF0ZSgiZTNkYy1yc2NwLjAuREIuSElTVE9SWV9EQVRBX0RBWS5USU1FX1NUQVJUIixmb3JtYXRpZXJ0ZXNEYXR1bSk7DQovLyBzZXRTdGF0ZSgiZTNkYy1yc2NwLjAuREIuSElTVE9SWV9EQVRBX01PTlRILlRJTUVfU1RBUlQiLGAke2phaHJ9LSR7bW9uYXR9LSR7dGFnfSAwMDowMDowMC4wMDBgKTsgDQovLyBzZXRTdGF0ZSgiZTNkYy1yc2NwLjAuREIuSElTVE9SWV9EQVRBX1dFRUsuVElNRV9TVEFSVCIsYCR7amFocn0tMDEtMDEgMDA6MDA6MDAuMDAwYCk7DQovLyBzZXRTdGF0ZSgiZTNkYy1yc2NwLjAuREIuSElTVE9SWV9EQVRBX1lFQVIuVElNRV9TVEFSVCIsYCR7amFocn0tMDEtMDEgMDA6MDA6MDAuMDAwYCk7DQovLyBjb25zb2xlLmxvZyhmb3JtYXRpZXJ0ZXNEYXR1bSk7</field>
          <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
        </block>
      </xml>
      

      Du musst die Datenpunkte anpassen...unter Umständen

      posted in Tester
      T
      TomTom24
    • Datenpunkt löschen - Fehler bei Erstellung

      Hallo,

      habe leider blind getippt und diesen DAtenpunkt erzeugt:

      {
        "common": {
          "name": "{ Batterie",
          "desc": "Manuell erzeugt",
          "role": "state",
          "type": "string",
          "read": true,
          "write": true,
          "def": ""
        },
        "type": "state",
        "native": {},
        "_id": "0_userdata.0.Apple.{__Batterie_:__98___}",
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        },
        "from": "system.adapter.admin.0",
        "user": "system.user.admin",
        "ts": 1709488369968
      }
      

      Das Problem ist anscheinend {Batterie:98} - irgendeine Idee, wie ich das Löschen kann`?
      Ergänzung: Der Löschversuch über die Gui erzeugt eine Errorseite - Gui stürzt ab.
      Danke.

      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: iqontrol-Serviceliste kürzen eigene Servicemessages

      @da_woody

      @da_woody sagte in iqontrol-Serviceliste kürzen eigene Servicemessages:

      was IMHO sinn hätte, auf 24 std loggen. da wären eventuelle fehler leichter zu finden.

      Wenn ich jeden Tag um 23:00 Uhr logge, dann habe ich die letzten 500 Nachrichten der letzten 24 Stunden. Ich schreibe in das Log ja selber rein. Du kannst das natürlich auch einfach mit mehr Zeilen oder längeren Intervallen laufen lassen.
      Daher maximal anpassbar 🙂

      posted in Visualisierung
      T
      TomTom24
    • IOB als Vermittler KNX - Homekit/Sprache/Visu - API's

      Hallo in die Runde,

      ich weiß nicht genau, ob ich hier richtig bin, aber ich wollte hier mal meine Lösung vorstellen für die Hausautomation mit dem iobroker.

      Wie ist mein Aufbau:

      1. Haus mit komplettem KNX.
      2. Alle Zimmer mit Präsenzmelder (Temp, Voc, CO2, Luftfeuchte etc.) inkl. , Steckdosen schaltbar, Licht über KNX
      3. Alle Fenster/Türen mit einfachen öffnen/schließen über KNX.
      4. Garagentor von Zapf
      5. Garagentür mit SwitchBot Türschloß und Keypad.
      6. 2 x G1 Bedienteile als KNX im Haus, in jedem Zimmer MDT Glastaster für eventuelle Einstellungen wie Stoßlüftung auslösen, Warmwasserpush etc. , Jalousie für Automatik sperren...
      7. bei KNX gibt es den X1 als Gehirn für komplexere Aufgaben

      Meine Oberfläche für die Benutzung ist Apple Homekit über:

      1. 1home Gateway - KNX zu Homekit
      2. iobroker mit z.b. yahka -Adapter
      3. Homebridge für weitere Einbindungen von Geräten zu Homekit
      4. Zabbix - als Überwachungszentrale für alles.
      5. iobroker - openknx - als Brücke zum KNX für Steuerung und Logging
      6. GiraIOT - für KNX ohne physisches Gerät - muss man nehmen, wenn man Datenpunkte nur im X1 anlegt und diese trotzdem bespielen will wie z.b. beim Garagentor. openKNX importiert nur GA, die eeine physiche Adresse haben. Das ist beim Einrichten only als Schaltelement über den X1 nicht der Fall.

      iobroker und ein paar andere Dinge laufen auf einem Proxmox - Server - spart eine Menge Arbeit. Es gibt einen Proxmox Backup Server separat.

      Meine Ziele:

      1. Sprachsteuerung (durch die dumme Siri)
      2. fast selbstpflegendes Bedienpanel durch Apple Homekit.
      3. Logging für Fehlersuche (mysql- iobroker)
      4. rudimentäre visuelle Grafiken für Fehlerchecks (Grafana + Mysql aus Iobroker).
      5. Ich habe keine Lust nach dem Haus zu sehen, es soll sich melden, wenn was nicht stimmt.
        Die Ziele habe ich erreicht.

      Aber was hat das nun mit iobroker zu tun?

      1. Iobroker funktioniert hier als Schnittstelle zwischen allen Systemen.
      Beispiele:

      • Ich habe im Flur einen G1 hängen, mit dem will ich direkt das Garagentor aufmachen und schließen, damit es offen ist, wenn ich aus dem Haus gehe.
        Leider kann der X1 KNX kein Javascript - also habe ich Datenpunkte angelegt und das Script hier aus dem Forum genutzt um den Datenpunkt zu steuern. Ähnlich ist es mit der Garagentür. Wenn ich jetzt auf dem G1 einen Schalter betätige, dann wird über openKNX ein Datenpunkt ausgelöst. Hier läuft ein Script in der Überwachung, dass dann das Garagentor öffnet.
      • Ich wollte die Stati meiner PV (Überschuss, Batterie wird geladen, Auto wird geladen, Netzbezug) einfach auf einen MDT Glastaster bringen. Dazu habe ich die Datenpunkte per Javascript aus der PV ausgelesen und dann über openKNX auf den Glastaster gebracht (grün heißt es wird ins Netz eingespeist)
      • Die Wärmepumpe ist von Weishaupt. Dazu gibt es zwar eine APP, aber wenn man zu Hause über einen Schalter oder über Siri einen WarmwasserPush auslösen will, so geht das nicht so richtig. Also habe ich mittels Node-Red (innerhalb von IOB) den Modbus ausgelesen (war wirklich kompliziert) und diese Daten in Datenpunkte geschrieben. Ihr werdet raten, was danach passiert ist... ich kann es jetzt in KNX auslösen oder mit Siri oder Homekit...wie ich gern möchte.
        Homekit:
        Homekit Ansicht IMG_0197.jpeg
        MDT Glastaster- hier grüne Lampe für Überschuss aus PV.
        MDT Glastaster - Einspeisung IMG_3387.jpeg
        Garagentür über KNX öffnen
        Garagentür und Tor über IOB und KNX - G1 - IMG_3388.jpeg
        Kleinee Übersicht Scripte für das Haus:
        Javascript - iob-Screenshot 2023-07-15 170744.png

      2. Zabbix als Überwachungsserver
      Zabbix kann als System sehr einfach Benachrichtigungen bei Abweichungen vom Soll verschicken und loggt die Daten auch gleich mit. Der Vorteil von Zabbix ist, dass einmal eingerichtet beliebige URL's als Datenlieferant genutzt werden können. Ich nutze als für alles, was ich nicht in Zabbix so reinbekomme die Datenpunkte vom IOB und lasse mir Pushovers zusenden. Das kann man auch direkt im IOB per Javascript machen, aber in Zabbix ist es schneller und einfacher zu lösen.

      Zabbix-Übersicht - Screenshot 2023-07-15 170353.png Zabbix-konfig-3Screenshot 2023-07-15 170634.png zabbix-konfig-2-Screenshot 2023-07-15 170607.png zabbix-konfig-1-Screenshot 2023-07-15 170524.png

      Im Serverschrank hängt noch ein Monitor an einer Shelly. Die wird durch Anwesenheit getriggert und schaltet bei Anwesenheit den Monitor an. Das dient als schnellen Check zum Hausstatus und dem Server, damit ich bei Arbeiten an der Technik nicht ständig aufs Handy schauen muss. Das ganze ist im Terminal gescriptet. Die Datenpunkte kommen vom IOB.
      Serveransicht:
      Serverpanel - IMG_3389.jpeg
      auszug aus dem Shellscript für den Monitor.png

      Proxmox Maschinen:
      Proxmox-Maschinen-Screenshot 2023-07-15 170707.png

      Ich bin sehr zufrieden mit der Lösung.
      Die Umsetzung von bestimmten Dingen ist mit nur KNX sehr schwer oder gar nicht lösbar. Homekit kann zwar auch Automationen, aber eben nur mit Homekit und ist auch ansonsten in der Programmierung eher sperrig. Daher ist es eine gute Lösung den IOB einzusetzen. Mit den Visualisierungen bin ich nicht so richtig warm geworden und wollte auch eine Sprachsteuerung, daher Homekit.

      Falls ich Fragen beantworten kann, mache ich das wirklich gern.

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: Support Adapter Energiefluss-erweitert v0.7.7

      @skb das war mir schon klar, weil es überall sonst da ist 🙂
      Trotzdem sehr geile Implementierung, da es sonst überall geht 👏

      posted in Visualisierung
      T
      TomTom24
    • Homekit Luftwerte ausgeben als Qualität

      Mit diesem Script steuere ich in Homekit die Anzeige der Luftqualität. Der schlechtere der beiden Werte wird für die Gesamtbewertung genommen.
      IMG_5077.jpeg IMG_5078.PNG

      Was braucht ihr:

      1. CO2 oder
      2. VOC oder
      3. beides
      4. Yhaka Adapter

      Einbauen:

      1. Script in global_Funktionen einfügen
      // Luftqualität für Homekit
      // 1 beste Qualität, 5 schlechteste Qualität 
      // es wird immer die schlechteste Qualität ausgegeben.
      
      function bewerteLuftqualitaet(co2, voc) {
        var co2Bewertung = 0;
        var vocBewertung = 0;
      // 1 sehr gut - 5 sehr schlecht
        if (co2 < 800) {
          co2Bewertung = 1;
        } else if (co2 < 1000) {
          co2Bewertung = 2;
        } else if (co2 < 1200) {
          co2Bewertung = 3;
        } else if (co2 < 1400) {
          co2Bewertung = 4;
        } else {
          co2Bewertung = 5;
        }
      
        if (voc < 65) {
          vocBewertung = 1;
        } else if (voc < 220) {
          vocBewertung = 2;
        } else if (voc < 660) {
          vocBewertung = 3;
        } else if (voc < 5500) {
          vocBewertung = 4;
        } else {
          vocBewertung = 5;
        }
      
        if (co2Bewertung > vocBewertung) {
          return co2Bewertung ;
        } else {
          return vocBewertung;
        }
      }
      
      

      2. Datenpunkte anlegen:
      Ihr müsst für jeden Raum einen Raumklima Wert anlegen. Wenn ihr meine Pfade nutzt, müsst ihr nichts weiter anpassen:
      0_userdata.0.Raumklima.Raumklima_<raum>
      Den Raumnamen nehme ich aus dem Objektname des Auslösers - dass heißt, dass der Raumname immer gleich sein muss, sonst wird nichts geschrieben.

      objekte_raumklima_iobroker.jpg

      Das folgende Script müsst ihr noch anlegen und laufen lassen. Die Sensoren lese ich als array aus - da müsst ihr mal schauen, wie die bei Euch heißen. Meine werden über openknx ausgelesen und kommen von Steinel true presence - bei mir heissen die immer

      • CO2_Messwert
      • VOC_Messwert
      // Luftqualität für Homekit berechnen
      
      on({ id: [].concat(Array.prototype.slice.apply($('channel[state.id=*VOC_Messwert*]'))).concat(Array.prototype.slice.apply($('channel[state.id=*CO2_Messwert*]'))), change: 'ne' }, async (obj) => {
      console.log('Datenpunkt ' + obj.id + ' wurde geändert.');    
      
      // hier lese ich den Raum aus meinen KNX Daten, in dem ich den String nach Punkten teile und mir das Teil mit dem Raumname nehme. 
      var datenpunkt = obj.id;
      var teile = datenpunkt.split('.');
      //console.log(teile);
      var haus = teile[4];
      //console.log("haus:" + haus)
      teile = haus.split('_');
      var raum = teile[0];
      
      // jetzt baue ich den Raumnamen ein, so dass das ganze Script übersichtlich bleibt.
      
      var co2=getState("openknx.0.Messwerte_BWM.Haus."+raum+"_CO2_Messwert").val;
      var voc=getState("openknx.0.Messwerte_BWM.Haus."+raum+"_VOC_Messwert").val;
      setState("0_userdata.0.Raumklima.Raumklima_"+raum,bewerteLuftqualitaet(co2,voc));
      console.log(raum + "-Luftqualität: "+bewerteLuftqualitaet(co2,voc) );
      });
      
      

      In Yahka legt ihr einen Airquality Sensor an.
      In den Datenpunkten Airqality tragt ihr dann den Datenpunkt für die Qualität ein
      z.b. Arbeitszimmer: 0_userdata.0.Raumklima.Raumklima_Arbeitszimmer
      Ihr könnt natürlich noch unter dem Voc Sensor die Vocdaten eintragen.

      yahka2.jpg yahka3.jpg

      Das war es schon. Bei Fragen einfach fragen.
      Gruß Tom

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: IOB als Vermittler KNX - Homekit/Sprache/Visu - API's

      @black-falcon87 hier mal ein paar Bilder
      Internet ist im Moment leer, Homebridge auch, da tauchen immer die neuen Geräte auf 🫣
      IMG_5079.jpeg IMG_5080.jpeg IMG_5081.jpeg IMG_5083.jpeg IMG_5082.jpeg profile (7).ovpn

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24

    Latest posts made by TomTom24

    • RE: Homelink - Garagentorantrieb Marantec

      Hi,
      ich habe mir ein Script gebastelt mit JS-Adapter. Das funktioniert sehr gut und man kann darüber einfach Schalter in Homekit anlegen und z.b. die Garage öffnen. Läuft hier seit über einem Jahr einwandfrei. Ab und zu muss der Adapater/Host neu gestartet werden, weil der Host aus irgendwelchen Gründen dann den Client nicht mehr kennt.

      1. Datenpunkte anlegen
      2. Dann braucht ihr nur noch ein kleines Script, dass die Werte open, close, stop, lighton, lightoff in den dp_cmd schreibt.
      3. DeviceName muss so sein, wie Eure Garage in Eurer App heißt!!

      Wie gesagt, läuft hier sehr zuverlässig.

      // wenns nicht geht - IP-Adresse Garage prüfen
      // Benötigt mqtt -wenns nicht geht - IP-Adresse Garage prüfen
      //
      //
      var net = require('net'); 
      
      var dp_door = "0_userdata.0.Garage.Garage_Status_Tor"; //door state
      var dp_light = "0_userdata.0.Garage.Garage_Status_Licht"; //light state
      var dp_cmd = "0_userdata.0.Garage.Garage_Command2"; //Befehlsdatenpunkt: Mögliche Werte: open, close, stop, lighton, lightoff. Nach Beschreiben wird der Datenpunkt wieder auf leer gesetzt
      
      var deviceName = "GARAGENNAME"; 
      var host = "IP_ADRESSE";
      var port = 2785;
      
      // random client, weil nach Stromausfall das Script nicht mehr lief, erst als anderer Client angegeben wurde.
      let x = Math.floor((Math.random() * 30) + 1);
      
      var client=x.toString; // Client mit übergeben
      
      function startClient() {
          client = new net.Socket();                 // Erzeugen eines neuen Verbindungsobjekts
          client.connect(port, host, function() {     // Gerät über host:port anwählen und Verbindung erzeugen
              console.log('cliend started');
          });
          client.on('data', function(data) {          // Wenn daten ankommen, dann verarbeiten
              console.log('client received: ' + data + " for device: " + deviceName);
              var dataS = data.toString().trim();              // Datenbuffer in lesbaren Text umwandeln
              switch(dataS) {                           // je nach rückgabewert unterschiedliche Bearbeitung
                  case "S;"+deviceName+";open":         // wenn open
                      setState(dp_door,"open",false);             // dann Datenpunkt setzen
                      setState(dp_door,"open",true);             // dann Datenpunkt setzen
                      // Garagentür ebenfalls öffnen
                      setState('alias.0.Garage.Garagentuer'/*Garagentuer auf zu*/, true)
                      console.log("Script Garage: "+dataS,"info");
                      break;
                  case "S;"+deviceName+";closed":
                      setState(dp_door,"closed",false);
                      setState(dp_door,"closed",true);
                      // Garagentür ebenfalls schließen
                      setState('alias.0.Garage.Garagentuer'/*Garagentuer auf zu*/, false) 
                      console.log("Script Garage: "+dataS,"info");
                      break;
                  case "S;"+deviceName+";opening":
                      setState(dp_door,"opening",false);
                      setState(dp_door,"opening",true);
                      console.log("Script Garage: "+dataS,"info");
                      break;
                  case "S;"+deviceName+";closing":
                      setState(dp_door,"closing",false);
                      setState(dp_door,"closing",true);
                      console.log("Script Garage: "+dataS,"info");
                      break;
                  case "S;"+deviceName+";lightOn":
                      setState(dp_light,"lightOn",false);
                      setState(dp_light,"lightOn",true);
                      console.log("Script Garage: "+dataS,"info");
                      break;
                  case "S;"+deviceName+";lightOff":
                      setState(dp_light,"lightOff",false);
                      setState(dp_light,"lightOff",true);
                      console.log("Script Garage: "+dataS,"info");
                      break;
              }
          });
          client.on("error",(err)=>{                  // wenn ein Fehler entsteht
              console.log("client error " + err.toString());
          });
          client.on("timeout",()=>{                   // wenn timeout entsteht
              console.log("client timeout");
          });
      }
      
      function sendMessage(host, port, message) {
          return new Promise((resolve, reject) => {     // Funktion ist asynchron, daher Rückgabe promise
              if (!client) {
                  console.log("No Client available :"+x);
                  resolve("Error");
                  return;
              }
              client.write(message);
              resolve("OK");
          });
      }
      
      onStop (function(){
           /* do something when script is stopped */
           if (client) {
              console.log('client ended ');
              client.end();
           }
      }, 1000);
      
      startClient();
      
      on(dp_cmd, function (obj) {                     // trigger wenn datenpunkt beschrieben wird
       var cmd;
       if (obj.state.ack || !obj.state.ack) {                       // aber nur wenn es sich um einen unbestätigten wert handelt
           cmd = String(obj.state.val).toLowerCase();  // Datenpunktinhalt in Kleinbuchstaben umwandeln
           console.log('execute command: ' + cmd);
           switch(cmd) {                           // je nach Datenpunktinhalt verschiedene Befehle
               case "open":                        // wenn open
                   sendMessage(host, port, "C;"+deviceName+";open"); // dann richtigen Befehl an Gerät senden
                   
                   break;
               case "close":
                   sendMessage(host, port, "C;"+deviceName+";close");
                   break;
               case "stop":
                   sendMessage(host, port, "C;"+deviceName+";stop");
                   break;
               case "lighton":
                   sendMessage(host, port, "C;"+deviceName+";lightOn");
                   break;
               case "lightoff":
                   sendMessage(host, port, "C;"+deviceName+";lightOff");
                   break;
           }
           
           setState(obj.id, {val: "", ack: false}); // datenpunkt auf leer als bestätigt setzen
       }
      });
      
      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: Update Admin mit Fehlercode 25 beendet

      @thomas-braun hatte über die GUI auch einen Fehler 25 (ebenfalls Proxmox). Anschließend einfach über Console upgegradet und es ging ohne Fehler durch.

      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: CheckMK - Monitoring von ioBroker / HomeMatic

      @apollon77 Ok, einfacher Datenpunkt auswerten von iobroker:

      1. Host anlegen - als Agent.
        host_Screenshot 2024-09-14 124159.jpg

      2. Ich habe hier ein Makro für die Url zum iobroker genommen. Du kannst aber auch die gesamte URL schreiben. Nur wenn man alles mal ändern muss....
        makro_url_Screenshot 2024-09-14 124259.jpg

      3. Dann legst Du den Datenpunkt wie folgt an, in dem Fall ein einfacher Datenpunkt true/false
        gefrierschrank_Screenshot 2024-09-14 124336.jpg

      4. im präprocessor kann man Werte manipulierern, so dass du das bekommst, was du willst.
        präprocessor_Screenshot 2024-09-14 124427.jpg

      5. Zum Schluss legt man einen Auslöser fest, der meldet sich dann. Du musst noch deine Benachrichtigungsoptionen für den Benutzer in Zabbix anlegen. Bei mir geht alles auf Pushover, weil das überall verfügbar ist.
        Die Werte im Präprocessor sind die, die auch in Zabbix verfügbar sind. Daher schauen worauf man prüft.
        Auslöser_Screenshot 2024-09-14 124516.png

      Das war so die kleinste Einrichtung von einem Datenpunkt.
      Man kann z.b. auch nur ein Gerät überwachen mit einem ICMPPink. Das mache ich z.b. bei meiner Wärmepumpe:
      Wärmepumpe_Screenshot 2024-09-14 125719.png
      Danach hat man gleich eine Warnmeldung bei Ping - Lost
      wp_auslöser_Screenshot 2024-09-14 125831.png

      Zabbix ist für mich die einfachere Lösung. Da gibt es viele Templates und auf URL wie bei Iobroker ist easy to use.
      Hier mal ein Teil meiner Überwachung:
      not all_Screenshot 2024-09-14 130024.png

      Am Ende ist mein Konzept, wenn was aus der Reihe läuft, dann soll sich das System melden. Ich will nicht immer schauen, ob alles läuft. Das klappt recht gut.

      Grüße Tom

      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: CheckMK - Monitoring von ioBroker / HomeMatic

      @codierknecht geht mir genauso, hatte mich auch für Zabbix entschieden und bin sehr zufrieden, weil auch die Einbindung von Datenpunkten super easy ist.

      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: yahka - Dynamische Infos ins HomeKit

      @von-cartman ja, sollte so funktionieren. Ich habe dazu ein AccessoryInformationen genommen als Service-Type und blende damit den Status der Wetterstation ein, nicht wirklich hübsch, funktioniert aber.
      Es kann sein, dass es nicht bei allen Servicetypen funktioniert.

      posted in ioBroker Allgemein
      T
      TomTom24
    • RE: Smartdisplay mit Wetter

      @ilovegym Das ist alles per Script geschrieben. Du benötigst nur Python und die Wavesharelibrary für das entsprechende Display.
      Hier mal ein Beispiel für die Positionierung der Temperatur mit Icon. az -> ist eine Referenz auf die Datei, wo ich alle Werte abhole. Ist relativ einfach zu verstehen, aber man hat schon mit der Positionierung ein paar Versuche, bis das klappt :).

      koordinaten_haustemp_x=koordinaten_block1_x
          koordinaten_haustemp_y=koordinaten_block1_y+100
          # Symbol Haus 
          draw_Himage.text((koordinaten_haustemp_x+70, koordinaten_haustemp_y), "H", font = sketchfont3, fill = 0)  
          #Temperatur Haus 
          draw_Himage.text((koordinaten_haustemp_x+105, koordinaten_haustemp_y), az.temperatur_haus, font = font38, fill = 0)  
          # Luftfeuchte
          draw_Himage.text((koordinaten_haustemp_x+120, koordinaten_haustemp_y+50), az.luftfeuchte_haus, font = font28, fill = 0)  
          # Symbol vor Wind
          draw_Himage.text((koordinaten_haustemp_x+220, koordinaten_haustemp_y+50), az.symbol_regenwahrscheinlichkeit, font = fontWeatherIcons30, fill = 0)  
          #Wind
          draw_Himage.text((koordinaten_haustemp_x+250, koordinaten_haustemp_y+50), az.regen_aktuell, font = font28, fill = 0) 
      
      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: Smartdisplay mit Wetter

      @ilovegym Die Grafiken sind alle Fonts. Das macht es leichter, du kannst zwar auch zeichnen, aber das erschien mir übertrieben :).

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: Smartdisplay mit Wetter

      @tomtom24 hier gibt es die Sources :
      http://tomtom24.great-site.net/downloads.html

      posted in Praktische Anwendungen (Showcase)
      T
      TomTom24
    • RE: Test Adapter Gira-IoT

      @haus-automatisierung Hi,

      ich habe immer wieder diese Meldung:

      Received value event for invalid state with UID "a064"
      

      Neustart etc. habe ich schon durch. Was kann ich noch machen?
      Das Objekt existiert natürlich nicht, aber ich weiß auch nicht, wo das herkommt.
      Danke.

      posted in Tester
      T
      TomTom24
    • RE: iOS App - Tester gesucht!

      @ilovegym nope, hat nix geholfen...

      iobroker url https://github.com/DNAngelX/ioBroker.iOSAppAdapter --debug
      install DNAngelX/ioBroker.iOSAppAdapter#c4bb9c68dd1fcd9f5b3f228a0bfb43d3b5c7455b
      NPM version: 10.7.0
      Installing DNAngelX/ioBroker.iOSAppAdapter#c4bb9c68dd1fcd9f5b3f228a0bfb43d3b5c7455b... (System call)
      
      up to date in 22s
      
      198 packages are looking for funding
        run `npm fund` for details
      
      host.PVE-Iobroker Cannot install DNAngelX/ioBroker.iOSAppAdapter#c4bb9c68dd1fcd9f5b3f228a0bfb43d3b5c7455b: 0
      
      posted in ioBroker Allgemein
      T
      TomTom24
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo