Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Adapter Architektur von ioBroker?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Adapter Architektur von ioBroker?

    This topic has been deleted. Only users with topic management privileges can see it.
    • ruhr70
      ruhr70 last edited by

      Ein Beispiel sind die Callids mit Ihren langsam aufbauenden Zuständen.

      Wenn ich das beim Überfliegen des ccu.io fritzbox-Adapters richtig gesehen habe, geht der davon aus, dass es immer max einen Anruf parallel gibt. Ich bin der Meinung, dass ich mit den Callids besser auch parallel Anrufe verarbeiten kann.

      Wenn man im bestehenden Gespräch den Adapter neu startet, dann sollen die aktuellen Zustände erhalten bleiben.

      mmh… das mit den Zuständen wird wahrscheinlich nicht funktionieren, da dann eine identische ID unter Umständen schon ein anderer Anruf ist. Ich denk das noch einmal durch, ob das persistent sein muss oder nicht.

      Die Antwort ist (?):

      • persistent über Objekte/Datenpunkte in ioBroker

      • flüchtig mit Variablen im Script

      Damit kann ich arbeiten.

      Danke für die Info mit den Funktionen! 🙂

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        > Wenn man im bestehenden Gespräch den Adapter neu startet, dann sollen die aktuellen Zustände erhalten bleiben.
        Ich denke das kann man Opfern.

        1 Reply Last reply Reply Quote 0
        • ruhr70
          ruhr70 last edited by

          ja, kann man 🙂

          Muss doch noch einmal stören. :mrgreen:

          Wie kann ich denn ein Objekt/Datenpunkt aus ioBroker lesen?

          Ich möchte einen DP aus Node-red lesen, und bei Änderung reagieren.

          Hintergrund. Für das Testen möchte ich den fertigen Callgenerator aus dem Node-red Flow nutzen. Dieser simuliert dann die Calls und schreibt die simulierte Fritzboxmeldung in ein Node-red Datenpunkt. Diesen möchte ich dann alternativ mit der parseData() Funktion verwenden.

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            Grummel…

            wahrscheinlich mit:

            var callgenMessage = adapter.getState("node-red.0.fritzbox.meldungAusDerFritzBox");
            

            Wundere mich, warum ich immer undefined zurückbekomme…

            In der Entwicklungsumgebung für ioBroker habe ich kein Node-red installiert, kein Flow, keine DP 😉 😉

            Allerdings bekomme ich Node-red auch nicht auf dem Mac installiert. Überlege mir was anderes.

            EDIT: mit einem tcp output in Node-red hat es funktioniert.

            1 Reply Last reply Reply Quote 0
            • Bluefox
              Bluefox last edited by

              @ruhr70:

              Grummel…

              wahrscheinlich mit:

              var callgenMessage = adapter.getState("node-red.0.fritzbox.meldungAusDerFritzBox");
              

              Wundere mich, warum ich immer undefined zurückbekomme…

              In der Entwicklungsumgebung für ioBroker habe ich kein Node-red installiert, kein Flow, keine DP 😉 😉

              Allerdings bekomme ich Node-red auch nicht auf dem Mac installiert. Überlege mir was anderes. `

              Richtig ist:

              adapter.getState("node-red.0.fritzbox.meldungAusDerFritzBox", function (err, val) {
                 // Asynchron!!
                 var callgenMessage = val.val;
              });
              
              

              Aber vermutlich du willst darauf reagieren , wenn das Wert gesetzt ist?

              Dann:

              • erst einmalig "Subscriben", z.B in "ready":
              adapter.subscribeForeignStates("node-red.0.fritzbox.*);
              
              

              Dann auf die Änderungen reagieren:

              adapter.on("stateChange", function (id, state) {
                   if (state && id == "node-red.0.fritzbox.meldungAusDerFritzBox") {
                        // New value of 
                        adapter.log.info(state .val);
                   }
              });
              
              
              1 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                Hi Bluefox,

                ich habe einen Punkt, an dem ich gerade hänge.

                Bist auf den history Channel habe ich alle Datenpunkte in der io-package.json definiert.

                Wenn ich den Fritzboxadapter in ioBroker installiere werden auch die Channels und die Objekte angelegt.

                In ioBroker sehe ich unter "Zustände" die Werte. In den ioBroker/Objekten bleiben die Werte leer 😞

                Den Datenpunkt schreibe ich mit:

                    adapter.setState('call.counterActualCalls.ringCount',        ringCount ,                 true);
                
                

                327_2015-06-20_zust_nde.png

                327_2015-06-20_objekte.png

                Die io-package.json sieht so aus:

                {
                  "common": {
                    "name": "fritzbox",
                    "version": "0.0.1",
                    "title": "fritzbox Adapter",
                    "desc": {
                      "en": "Adapter verarbeitet die Anrufinformation der Fritzbox über tcp, Port 1012 (Callmonitor in der Fritzbox mit #96*5* aktivieren)",
                      "de": "Adapter verarbeitet die Anrufinformation der Fritzbox über tcp, Port 1012 (Callmonitor in der Fritzbox mit #96*5* aktivieren)",
                      "ru": "Adapter verarbeitet die Anrufinformation der Fritzbox über tcp, Port 1012 (Callmonitor in der Fritzbox mit #96*5* aktivieren)"
                    },
                    "authors": [
                      "ruhr <ruhr@digheim.de>"
                    ],
                    "license": "MIT",
                    "platform": "Javascript/Node.js",
                    "mode": "daemon",
                    "availableModes": [
                      "daemon"
                    ],
                    "readme": "https://github.com/ioBroker/.../README.md",
                    "loglevel": "debug",
                    "icon": "fritzbox.png",
                    "keywords": [
                      "fritzbox",
                      "cdr",
                      "callmonitor"
                    ],
                    "extIcon": "",
                    "type": "communication"
                  },
                  "native": {
                    "devices": [],
                    "interval": 60000
                  },
                  "objects": [],
                  "instanceObjects": [
                    {
                      "_id": "message",
                      "type": "state",
                      "common": {
                        "name": "Last fritzbox message",
                        "type": "string",
                        "role": "message",
                        "read": true,
                        "write": false,
                        "desc": "last message from fritzbox as string"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls",
                      "type": "channel",
                      "common": {
                        "name": "calls",
                        "role": "call info"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.ring",
                      "type": "state",
                      "common": {
                        "name": "ring activ?",
                        "type": "boolean",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "ring activ?"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.missedCount",
                      "type": "state",
                      "common": {
                        "name": "Counter: rings missed",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": true,
                        "desc": "Counter: rings missed"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.ringActualNumber",
                      "type": "state",
                      "common": {
                        "name": "actual last ringing number",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "actual last ringing number"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.ringActualNumbers",
                      "type": "state",
                      "common": {
                        "name": "actual ringing numbers",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "actual ringing numbers"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.ringLastNumber",
                      "type": "state",
                      "common": {
                        "name": "ring last number",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "ring last number"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.ringLastMissedNumber",
                      "type": "state",
                      "common": {
                        "name": "ring last missed number",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "ring last missed number"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.callLastNumber",
                      "type": "state",
                      "common": {
                        "name": "call last number",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "call last number"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.connectNumber",
                      "type": "state",
                      "common": {
                        "name": "actual last connected number",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "actual last connected number"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.connectNumbers",
                      "type": "state",
                      "common": {
                        "name": "actual last connected numbers",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "actual last connected numbers"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.counterActualCalls",
                      "type": "channel",
                      "common": {
                        "name": "calls",
                        "role": "call info"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.counterActualCalls.allActiveCount",
                      "type": "state",
                      "common": {
                        "name": "Counter: all active Calls",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "Counter: all active Calls"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.counterActualCalls.connectCount",
                      "type": "state",
                      "common": {
                        "name": "actual activ onnects",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "Counter: actual activ connected calls"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.counterActualCalls.ringCount",
                      "type": "state",
                      "common": {
                        "name": "actual ring count",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "Counter: actual ring"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.counterActualCalls.callCount",
                      "type": "state",
                      "common": {
                        "name": "actual activ calls",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "Counter: actual activ calls"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.telLinks",
                      "type": "channel",
                      "common": {
                        "name": "calls",
                        "role": "call info"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.telLinks.ringLastNumberTel",
                      "type": "state",
                      "common": {
                        "name": "ring last number tel:link",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "ring last number tel:link"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.telLinks.callLastNumberTel",
                      "type": "state",
                      "common": {
                        "name": "call last number tel:link",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "call last number tel:link"
                      },
                      "native": {}
                    },
                    {
                      "_id": "calls.telLinks.ringLastMissedNumberTel",
                      "type": "state",
                      "common": {
                        "name": "ring last missed number tel:link",
                        "type": "string",
                        "role": "call info",
                        "read": true,
                        "write": false,
                        "desc": "ring last missed number tel:link"
                      },
                      "native": {}
                    },
                    {
                      "_id": "history",
                      "type": "channel",
                      "common": {
                        "name": "history calls",
                        "role": "history calls"
                      },
                      "native": {}
                    },
                    {
                      "_id": "history.allTableHTML",
                      "type": "state",
                      "common": {
                        "name": "history of calls as HTML",
                        "type": "string",
                        "role": "history",
                        "read": true,
                        "write": false,
                        "desc": "history of calls as HTML"
                      },
                      "native": {}
                    },
                    {
                      "_id": "history.allTableJSON",
                      "type": "state",
                      "common": {
                        "name": "history of calls as JSON",
                        "type": "string",
                        "role": "history",
                        "read": true,
                        "write": false,
                        "desc": "history of calls as JSON"
                      },
                      "native": {}
                    }
                  ]
                }</ruhr@digheim.de>
                

                Ich hoffe, es ist nur eine Kleinigkeit 😉

                Viele Grüße und danke schon einmal 🙂

                Michael

                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  Dein Namens-Model ist durcheinander:

                  States                        Objects
                  ---------------------------------------------
                  fritzbox.0.system.deltaTime   ???
                  call                          calls
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • ruhr70
                    ruhr70 last edited by

                    Guten Morgen Bluefox,

                    sorry, ich verstehe es noch nicht…

                    Vielleicht habe ich noch ein generelles Verständnisproblem von den Channels und Objekten.

                    Der Channel (type:channel):

                    fritzbox.0.system

                    Und das Objekt (type:state):

                    fritzbox.0.system.deltaTime

                    fehlten in der Tat in meiner io-packages.json Datei.

                    Ich habe dies in der JSON ergänzt:

                        {
                          "_id": "system",
                          "type": "channel",
                          "common": {
                            "name": "history calls",
                            "role": "history calls"
                          },
                          "native": {}
                        },
                        {
                          "_id": "system.deltaTime",
                          "type": "state",
                          "common": {
                            "name": "delta time in seconds between fritzbox and ioBroker",
                            "type": "string",
                            "role": "seconds",
                            "read": true,
                            "write": false,
                            "desc": "delta time in seconds between fritzbox and ioBroker"
                          },
                          "native": {}
                        },
                    
                    

                    Und schon wird das Objekt angelegt und über den Adapter gefüllt.

                    Aber warum funktioniert das im Channel Calls nicht?

                    Da habe ich Tomaten auf den Augen.

                    Da ist in der JSON folgendes angelegt:

                    Der Channel (type:channel):

                    fritzbox.0.calls

                    Und das Objekt (type:state):

                    fritzbox.0.system.ring

                        {
                          "_id": "calls",
                          "type": "channel",
                          "common": {
                            "name": "calls",
                            "role": "call info"
                          },
                          "native": {}
                        },
                        {
                          "_id": "calls.ring",
                          "type": "state",
                          "common": {
                            "name": "ring activ?",
                            "type": "boolean",
                            "role": "call info",
                            "read": true,
                            "write": false,
                            "desc": "ring activ?"
                          },
                          "native": {}
                        },
                    
                    

                    Hier wird das Objekt nicht gefüllt.

                    Der einzige Unterschied, der mit auffällt, ist dass ich in dem Channel Calls noch weitere Channels angelegt habe.

                    Der Channel (type:channel):

                    fritzbox.0.calls

                    enthält z.B. noch einen Channel:

                    fritzbox.0.calls.telLinks

                    sorry. ich habe es versucht, bin aber mit Deiner Antwort nicht weiter gekommen :?

                    VG,

                    Michael

                    1 Reply Last reply Reply Quote 0
                    • Bluefox
                      Bluefox last edited by

                      Dein Objekt heißt "calls" und dein Zustand heißt "call"

                      1 Reply Last reply Reply Quote 0
                      • ruhr70
                        ruhr70 last edited by

                        oh Gott…

                        Das nenne ich blind... :shock: 😮

                        Danke Dir Bluefox! Da hatte ich wirklich Tomaten auf den Augen. Zigmal drüber geschaut...

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          Hi Bluefox,

                          ich habe leider noch einen Punkt, an dem ich nicht weiter komme 😞

                          Ich möchte Dein Tabellen Widget nutzen und dafür ein JSON schreiben. Leider komt dies nie in den ioBroker Objekten an. Ich hoffe, es ist nicht wieder ein einfacher Schreibfehler. :?

                          Zum Test wird ein Array mit einem einfachen Objekt befüllt:

                                  var lineHistoryAllJson = {
                                      "Uhrzeit" : call[id].date,
                                      "Anrufer" : call[id].externalNumber
                                  };
                          
                                  historyListAllJson.unshift(lineHistoryAllJson);
                                  if (historyListAllJson > configHistoryAllLines) {
                                      historyListAllJson.length = configHistoryAllLines;
                                  }
                          
                          

                          So will ich es in Richtung ioBroker schreiben:

                                  adapter.setState('history.allTableJSON',        historyListAllJson,                 true);
                          
                          

                          Und zum Test lass ich mir jeweils das erste Objekt im Log ausgeben:

                                  adapter.log.info("historyListAllJson[0] " + historyListAllJson[0].Uhrzeit + " " + historyListAllJson[0].Anrufer);
                          
                          

                          Als Ergebnis erhalte ich im Log:

                          2015-06-21 22:55:24.126  - info: fritzbox.0 historyListAllJson[0] 21.06.15 22:55:24 040207714031
                          

                          So ist das Objekt in der io-package.json definiert:

                              {
                                "_id": "history.allTableJSON",
                                "type": "state",
                                "common": {
                                  "name": "history of calls as JSON",
                                  "type": "object",
                                  "role": "table",
                                  "read": true,
                                  "write": false,
                                  "desc": "history of calls as JSON"
                                },
                                "native": {}
                              },
                          
                          

                          In ioBroker bekomme ich meine Tabellen als html und txt im selben Channel. Nur das Objekt history.allTableJSON will einfach nicht funktionieren.

                          Nach dem call/calls traue ich mich schon fast gar nicht mehr zu fragen… momentan hänge ich aber leider an der Stelle.

                          VG,

                          Michael

                          1 Reply Last reply Reply Quote 0
                          • Bluefox
                            Bluefox last edited by

                            Versuch mal:

                            adapter.setState('history.allTableJSON',        JSON.stringify(historyListAllJson),                 true);
                            
                            1 Reply Last reply Reply Quote 0
                            • ruhr70
                              ruhr70 last edited by

                              Hi Bluefox,

                              die tägliche Frage… :mrgreen: :?

                              Ich habe jetzt soweit den Node-Red Flow komplett für den Adapter umgesetzt und um einige Ausgaben ergänzt.

                              Jetzt stehe ich mangels Wissen wieder vor einer kleinen Hürde...

                              Im Node-red Flow hatte ich im Callmonitor die Gesprächssekunden der bestehenden Verbindungen hochgezählt. Dies würde ich noch gerne realisieren, bevor ich mich an der Config-Webseite versuche. Mir fehlt aber jede Idee.

                              D.h., wenn ein Connect aktiv ist, möchte ich einen Wert jede Sekunde hochzählen. Das Programm muss in der Zeit aber ganz normal weiter ausgeführt werden (parallele Calls).

                              Ein kleiner Tipp... 😉 ...für einen Einsteiger...

                              Wenn das gelöst ist, wären die nächsten Schritte:

                              (1)

                              • Config über die Webseite

                              • Dokumentation der einzelnen Objekte/Datenpunkte

                              • (mal drüber sehen, ob die Objekte so Sinn machen)

                              • veröffentlichen?

                              (2)

                              Dann als nächstes folgende Erweiterungen für eine Version 2:

                              • Telefonbuchimport und Verarbeitung

                              • Verfeinerung der Config für den Anwender

                              • (möglichst keine Änderungen an den Objekten/Datenpunkten)

                              327_2016-06-22_adapter_ist-stand.png

                              1 Reply Last reply Reply Quote 0
                              • Bluefox
                                Bluefox last edited by

                                @ruhr70:

                                Hi Bluefox,

                                die tägliche Frage… :mrgreen: :?

                                Ich habe jetzt soweit den Node-Red Flow komplett für den Adapter umgesetzt und um einige Ausgaben ergänzt.

                                Jetzt stehe ich mangels Wissen wieder vor einer kleinen Hürde...

                                Im Node-red Flow hatte ich im Callmonitor die Gesprächssekunden der bestehenden Verbindungen hochgezählt. Dies würde ich noch gerne realisieren, bevor ich mich an der Config-Webseite versuche. Mir fehlt aber jede Idee.

                                D.h., wenn ein Connect aktiv ist, möchte ich einen Wert jede Sekunde hochzählen. Das Programm muss in der Zeit aber ganz normal weiter ausgeführt werden (parallele Calls).

                                Ein kleiner Tipp... 😉 ...für einen Einsteiger...

                                Wenn das gelöst ist, wären die nächsten Schritte:

                                (1)

                                • Config über die Webseite

                                • Dokumentation der einzelnen Objekte/Datenpunkte

                                • (mal drüber sehen, ob die Objekte so Sinn machen)

                                • veröffentlichen?

                                (2)

                                Dann als nächstes folgende Erweiterungen für eine Version 2:

                                • Telefonbuchimport und Verarbeitung

                                • Verfeinerung der Config für den Anwender

                                • (möglichst keine Änderungen an den Objekten/Datenpunkten)

                                filename="2016-06-22 Adapter Ist-Stand.png" index="0">~~ `

                                var intervalRunningCall = null;
                                
                                if (callStarted && !intervalRunningCall) {
                                    // Do it every second
                                    intervalRunningCall = setInterval(function () {
                                          adapter.getState('call.time', function(err, state) {
                                               adapter.setState('call.time', state.val + 1);
                                          });
                                    }, 1000);
                                } else if (!callStarted && intervalRunningCall) {
                                   // Stop interval
                                   clearInterval(intervalRunningCall);
                                   intervalRunningCall = null;
                                }
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                649
                                Online

                                31.7k
                                Users

                                79.8k
                                Topics

                                1.3m
                                Posts

                                4
                                29
                                5752
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo