Navigation

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

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    E
    • Profile
    • Following 1
    • Followers 1
    • Topics 29
    • Posts 165
    • Best 3
    • Groups 2

    ehome

    @ehome

    6
    Reputation
    90
    Profile views
    165
    Posts
    1
    Followers
    1
    Following
    Joined Last Online

    ehome Follow
    Pro Starter

    Best posts made by ehome

    • Bewässerung und Bedienpanel für den Garten

      Ich möchte Euch meinen Lösungsansatz für eine Gartenbewässerung mit. Bedienpanel vorstellen.

      Basis des ganzen sind 4 Rainbird Ventile, deren Trafos ich über homematic ansteuern kann. Haben sie Strom öffnen sie, ist der Strom weg, bleiben sie geschlossen. Das Thema Ansteuerung der Ventile ist damit schon abgehakt.
      Etwas kniffliger wird es dann schon bei dem Thema Logik und Bedienbarkeit.
      Ich setze VIS zur Visualiserungmeiner ioBroker Umgebung ein möchte aber im Garten nicht unbedingt immer mit dem Handy alles steuern müssen und im Garten ein Tablet aufhängen... - na ja.
      Deshalb habe ich mir mit einem ESP und etwas Holz ein Bedienpanel gebaut.
      ber_luw -13.jpeg
      Eine detaillierte Bau-Anleitung, die STL-Files für den 3d Druck und die ioBroker-Skripte findet sich hier.

      Im Automatik-Modus gehen die Beregner zeitgesteuert (Sonnenuntergang) an, ich habe lange überlegt, wie ich den Timer realisiere, um sicher zu gehen, dass die Beregnung auch wieder gestoppt wird wenn die vorgegeben Zeit abgelaufen ist.
      Letztlich habe ich mich dann für's Skripten und gegen den Szenen-Adapter entschieden.
      Dabei herausgekommen sind:

      • Pro Ventil ein Skript, welches mit der setTimeout() Funktion das Ventil zeitgesteuert schließt.

      • ein "Holzhammer Skript" welches kontrolliert ob das Ventil nicht länger aktiv ist als die max. Beregnungszeit.

      Das Holzhammer Skript läuft zur Sicherheit in einer anderen javascript Instanz.

      Das Panel habe ich dann über den MQTT Adapter eingebunden, wobei die 5 Taster des Panels direkt an homematic angeschlossen sind. In einer Übersicht sieht das dann so aus:

      ber_luw_plan.PNG

      Ich freue mich auf euer Feedback.

      Viele Grüße
      Olli

      posted in Praktische Anwendungen (Showcase)
      E
      ehome
    • RE: ical zeigt keine ganztägigen Ereignisse

      @haus-automatisierung
      so, wollte dann mal nach langer Zeit eine Rückmeldung geben.
      Nachdem ich das ganze für ein paar Wochen gefrustet liegen gelassen habe,
      hab ich mich ab WE nochmal damit versucht. Beide Adapter gelöscht, die verbleibenden
      Datenpunkte gelöscht und anschließend die Adapter neu installiert (hatte ich zwar schon versucht ...)
      Und dann ging es sofort - warum auch immer.

      Nochmal allen Danke für die Unterstützung und einen schönen Abend noch.

      posted in ioBroker Allgemein
      E
      ehome
    • RE: [Skript] Json mit Messdaten mittels SolarEdge-API abholen und Werte einzeln verarbeiten

      @PV_Mainz

      ich hole mir zur Zeit nur die Gesamtproduktionsdaten ab.
      Du musst das Skript aber anpassen, da ich für meine Werte eine
      eigene Objekstruktur baue. (Versorgung.0.....)

      //
      // Abholen der livetime Daten Produktion via API
      //
      
      const PATH = 'Versorgung.0.SolarEdgeAPI.';
      let ID_PROD=PATH+'ProduktionLifetime';
      let ID_DELTA=PATH+'ProduktionDelta2Modbus';
      let ID_MODBUSDATA='modbus.0.holdingRegisters.1.40094_I_AC_Energy_WH'
      let ID_CONVERTERSTATUS='modbus.0.holdingRegisters.1.40107_I_Status'/*Operation State*/
      let api_key=getState(PATH+'apiKey').val;
      let logging=false;
      
      // erstellen des Objekts, wenn noch nicht vorhanden
      mk_prodlifetime(ID_PROD);
      mk_delta2modbus(ID_DELTA);
      
      // abholen der Daten nur, wenn PV produziert um Anzahl der API calls zu begrenzen
      // 4=prod
      
      getOverviewSolaredge(api_key);
      
      schedule('*/10 * * * *', function () {
          var statusPV=Number(getState(ID_CONVERTERSTATUS).val);
          tolog(logging,"StatusPV: "+statusPV);
          if (statusPV == 4) {
              tolog(logging,"Aktualisiere PV LifetimeProd");
              getOverviewSolaredge(api_key);
          }
      });
      
      
      function getOverviewSolaredge(akey){
          var url = 'https://monitoringapi.solaredge.com/site/528008/overview.json?api_key='+akey;
          tolog(logging,"GET DATA FROM: "+url);
          var answer;
          request(url, function (err, state, body){
              if (body) {
                  tolog(logging,'Request - alles ok');
                  var obTyp=typeof(body);
                  tolog(logging,"Reques return type:"+obTyp);
                  tolog(logging,"response: "+state);
                  if (testJSON(body) === true) {
                      body=JSON.parse(body);
                      var lifetimeProd=body.overview.lifeTimeData.energy/1000;
                      setState(ID_PROD,lifetimeProd,true);
                      tolog(logging,"get lifetime prod:"+lifetimeProd);
                  }
              } else {
                  log('Request meldet Fehler: ' + err, 'error');  
              }
      
          });
      }  
      
      function testJSON(text){
          if (typeof text!=="string"){
              return false;
          }
          try{
              JSON.parse(text);
              return true;
          }
          catch (error){
              return false;
          }
      }
      
      
      function mk_prodlifetime (path){
          
          var obj = {};
              obj.type = 'state';
              obj.common = {};
              obj.common.name = 'Lifetime production';
              obj.common.type = 'number';
              obj.common.role = 'value';
              obj.common.unit = 'kWh' ;
              obj.common.read = true;
              obj.common.write = false;
          setzeObject(path, obj);
      }  
      
      
      function tolog (logging,logText,logFileName='std') {
          if (logging===true ) {
              if (logFileName != 'std') {
                  let ts = new Date()
                  let millisec=ts.getMilliseconds()
                  let datum = formatDate(ts, "YYYY-MM-DD hh:mm:ss.") + millisec + " \t";
                  let fn = "/opt/iobroker/log/"+logFileName;
                  fs.appendFileSync(fn, datum + logText + "\n");
              } else {
                  log(logText)
              }
          }
      }
      

      Die Funktion tolog ist bei mir eine globale Funktion, der Einfachheit halber habe ich sie mal einfach mit in das Skript hier gepackt.

      Ich hoffe das hilft.
      Gruß
      Olli

      posted in Skripten / Logik
      E
      ehome

    Latest posts made by ehome

    • RE: Gültigkeitsbereiche von Variablen

      @bananajoe

      Ups, sorry .
      Hatte den Post gelöscht, da ich mit meinem Skript ziemlich auf dem Holzweg war - ich glaube da war der Mix aus let und const das geringste Problem .....
      Meine Lektion des Woche: Objekte lassen sich nicht mit ObjektNeu=Objekt kopieren ....

      Momentan verwende ich tsMax noch nicht. Habe es aber erst einmal im code drin gelassen....

      create_states und tolog sind globale Funktionen und stehen daher nicht im code
      Hier der funktionierende Code:

      
      // Skript  zum erfassen der Max Arbeit pro tag
      // die maximal Werte werden in powerMax gesichert
      // und zum Tagesanfang resettet
      
      
      let logging=true
      
      //  Prod
      let sourcePath='alias.0.power'
      let targetPath="0_userdata.0.Auswertungen.maxPowerDaily"
      
      // Test
      //let targetPath="0_userdata.0.test.maxPower"
      //let sourcePath="0_userdata.0.test.aliasPower"
      
      var stateObjects=readLoggingObject(sourcePath+"*") // Liste der datenpunkte mit aktuellem Wert als initial wert
      const stateObjectsKeys=keys = Object.keys(stateObjects);
      //log(stateObjectsKeys)
      
      // beim start sind valMax=val und tsMax=ts 
      // sind target datenpunkte noch nicht vorhanden werden sie mit den aktuellen werten angelegt
      
      for (let key in stateObjects) {
        create_states([[targetPath+"."+getDpShort(key), {'name':getDpShort(key), 'type':'number', 'read':true, 'write':true, 'role': "value", 'unit': "W", 'def':  stateObjects[key].val}]])
      }
      
      // falls es einen restart gegeben hat, werden die letzten aktuellen max werte eingelesen
      
      for (let key in stateObjects) {
        if (stateObjects.hasOwnProperty(key)) {
          stateObjects[key]['tsMax'] = getState(targetPath+"."+getDpShort(key)).ts;
          stateObjects[key]['valMax'] = getState(targetPath+"."+getDpShort(key)).val;
        }
      }
      
      //log(stateObjects)
      
      on({id:stateObjectsKeys, change:'ne'}, function (obj) { 
        stateObjects[obj.id]['val']=obj.state.val
        stateObjects[obj.id]['ts']=obj.state.ts
        if (obj.state.val > stateObjects[obj.id]['valMax']) {
          stateObjects[obj.id]['valMax'] = obj.state.val
          stateObjects[obj.id]['tsMax'] = obj.state.ts
          setState(targetPath+"."+getDpShort(obj.id),obj.state.val,true)
        }
      })
       
      // zu tagesbeginn werden die max-werte zurück gesetzt
      
      schedule("0 0 * * *", function () {
        tolog(logging,"Reset max values in "+targetPath)
        for (let key in stateObjects) {
          if (stateObjects.hasOwnProperty(key)) {
            stateObjects[key]['tsMax'] = stateObjects[key].ts;
            stateObjects[key]['valMax'] = stateObjects[key].val;
            setState(targetPath+"."+getDpShort(key),stateObjects[key].val,true)
          }
        }
      })
      
      // funktion zum erstellen von datenpunkten 
      
      function create_states(statesToCreate) { 
              createUserStates('0_userdata.0.', false, statesToCreate, function(){
              tolog(logging,"States der Statistikenfür alle Counter erstellt");
          })
      }
      
      // einlesen der werte
      
      function readLoggingObject(object_datapoints) {
        let loggingObj={}
        $(object_datapoints).each(function (id, i) {
            const state = getState(id);          
            if (state && !isNaN(state.val)) {
                loggingObj[id] = state
            } else {
                loggingObj[id].state={};
            }
        })
        return loggingObj
      }
      
      function logDp(obj) {
        for (const key of Object.keys(obj)) {
          tolog(logging,"Key: "+key+" aktuell: "+obj[key]['val']+" Max: "+obj[key]['valMax']+" MaxTS: "+obj[key]['tsMax'])
        }
      }
      
      // erstellen des short names
      
      function getDpShort(str) {
        const parts = str.split('.');
        return parts[parts.length - 1];
      }
      
      posted in JavaScript
      E
      ehome
    • Gültigkeitsbereiche von Variablen

      kann leider den Post nicht löschen ......

      posted in JavaScript
      E
      ehome
    • RE: Countdown ersetzen anstatt neuen zu erzeugen

      @geschild
      ja, die Adapterberschreibung kenn ich, aber ich möchte ja gerade nicht den Timer löschen sondern ändern.

      posted in Skripten / Logik
      E
      ehome
    • Countdown ersetzen anstatt neuen zu erzeugen

      Hallo,
      ich benötige für ein Skript die Möglichkeit einen Countdown (mit dem betr. Adapter countdown) neu zu setzen bevor der vorhergehnede Countdown zu Ende gegangen ist.

      Das ganze soll so laufen, dass ich unter 0_userdata für jeden Raum Parameter für die Automatisierung festlegen kann. Einer davon ist "Anwesend". Dieser soll auf true gesetzt werden wenn z.B. der Bewegungsmelder in dem Raum anspricht oder ein Lichtschalter in dem Raum betätigt wird.

      Sobald eine Bewegung erkannt bzw. Lichtschalter betätigt wird soll bei einem bereits laufenden countdown die Zielzeit neu gesetzt werden.

      Wenn man dies mit "sendTo" macht wird der bestehende Countdown aber nicht geändert.
      Löschen und neu Anlegen ist auch keine Alternative, da bei Änderung des Datenpunktes für das ablaufen des Countdowns != false die Anwesenheit dann auf "false" gesetzt werden und ein "flackern" vermieden werden soll.

      Weiss jemand wie man einen laufenden Timer updaten kann ?

      $('channel[state.id=*.STATE](functions=Bewegung)').on(function(obj) {
          
          let raum=getRoom(obj.id)
          let timername="Anwesenheit"+raum
          let anwesendId="0_userdata.0.RS."+raum+".Anwesend"
          let timerEndId="countdown.0.countdowns."+timername+".reached"
      
          if (getState(obj.id).val == true) {
             
              let automatikAus=getState("0_userdata.0.RS."+raum+".LichtAutoAus").val
              let automatikEin=getState("0_userdata.0.RS."+raum+".LichtAutoAn").val
              let timeout=getState("0_userdata.0.RS."+raum+".Anwesenheit_CounterSet").val
              let timerEndDateTime = addMinutes(new Date(), timeout)
              
              tolog(logging,("Licht:      "  + obj.id))
              tolog(logging,("Raum:       "  + raum))
              tolog(logging,("AutoAus:    "  + automatikAus))
              tolog(logging,("AutoEin:    "  + automatikEin))
              tolog(logging,("anwesendId: "  + anwesendId))
              tolog(logging,("timeout:    "  + timeout))
              tolog(logging,("timerEnd:   "  + timerEndDateTime))
      
              sendTo("countdown.0", "send", {
                     "name": timername,
                     "date": timerEndDateTime
              })
              setState(anwesendId,true,true)
      
              on({id:timerEndId, value: 'true'}, function (obj) {
                  setState(anwesendId,false,true)
              })
      
          }
      });
      
      posted in Skripten / Logik
      E
      ehome
    • RE: js-controller 5.0.x jetzt in der BETA

      @thomas-braun @crunchip danke für die Aufklärung, hab mich mal aus dem beta-Programm abgemeldet 😉 und einen downgrade durchgeführt. Warte dann bis alle "stable" ist.

      posted in ioBroker Allgemein
      E
      ehome
    • RE: ical zeigt keine ganztägigen Ereignisse

      @haus-automatisierung
      so, wollte dann mal nach langer Zeit eine Rückmeldung geben.
      Nachdem ich das ganze für ein paar Wochen gefrustet liegen gelassen habe,
      hab ich mich ab WE nochmal damit versucht. Beide Adapter gelöscht, die verbleibenden
      Datenpunkte gelöscht und anschließend die Adapter neu installiert (hatte ich zwar schon versucht ...)
      Und dann ging es sofort - warum auch immer.

      Nochmal allen Danke für die Unterstützung und einen schönen Abend noch.

      posted in ioBroker Allgemein
      E
      ehome
    • RE: js-controller 5.0.x jetzt in der BETA

      @apollon77 So ich oute mich mal als Voll-Honk....

      habe heute morgen den upgrade js-controller gemacht, da er mir als neu im Webinterface unter Hosts angezeigt wurde. Mir war nicht bewusst, dass ich mit dem Update zum Beta-Tester werde, ich dachte immer da müsste man das entsprechende repo eingebunden haben .....

      root@iobroker:/opt/iobroker# iob repo list
      Stable (default): http://download.iobroker.net/sources-dist-latest.json
      
      Active repo(s): Stable (default)
      

      In meinem Multi-Host System habe ich dann den Master und anschließend den Client upgedatet - ging über das CLI fehlerlos.

      Dann gingen die Probleme mit dem Viessmann-Adapter los....

      Meinen Post: Nach update js-controller Probleme mit Viesmann Adapter in "Iobroker Allgemein" hat @Homoran daraufhin gesperrt (er hat natürlich recht - is ja beta) mit dem Verweis den Post in diesem Bereich zu erstellen.
      Jetzt meine Fragen:

      1. wie verschiebe ich den Post - er ist gesperrt und ich kann nichts daran ändern
      2. gibt es einen einfachen Weg zurück
      3. wieso wird mir das Update angezeigt obwohl ich kein beta-repo eingebunden habe...

      Fragen über Fragen .....

      posted in ioBroker Allgemein
      E
      ehome
    • Nach update js-controller Probleme mit Viesmann Adapter

      Hallo,
      hat jemand ein ähnliches Problem nach dem Update auf js-controller v5.0.3 mit dem Viesmann
      Adapter ?

      Da die Probleme nach dem Update des js-controllers auftauchten vermute ich den Fehler irgendwo dort - kann es aber nicht genau sagen. Deshalb wäre es interessant ob jemand den Adapter mit der js-controller version laufen hat.

      Bei mir installiert:
      js-controller v5.0.3 (docker based)
      viessmann v1.4.3
      npm: 18.16.09.5.1

      Fehler im Log:

      2023-06-15 21:55:06.489  - info: host.iobroker instance system.adapter.viessmann.0 started with pid 55242
      2023-06-15 21:55:07.969  - error: viessmann.0 (55242) Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
      2023-06-15 21:55:07.970  - error: viessmann.0 (55242) unhandled promise rejection: Parameter "options" needs to be a real object but type "boolean" has been passed
      2023-06-15 21:55:07.972  - error: viessmann.0 (55242) Error: Parameter "options" needs to be a real object but type "boolean" has been passed
          at Viessmann.setState (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/lib/adapter/adapter.js:5331:35)
          at Viessmann.setStateAsync (/opt/iobroker/node_modules/@iobroker/js-controller-common/build/lib/common/tools.js:2006:16)
          at Viessmann.main (/opt/iobroker/node_modules/iobroker.viessmann/main.js:588:8)
          at Viessmann.startAdapter (/opt/iobroker/node_modules/iobroker.viessmann/main.js:116:15)
          at Viessmann.onReady (/opt/iobroker/node_modules/iobroker.viessmann/main.js:55:9)
          at Viessmann.emit (node:events:513:28)
          at Viessmann._callReadyHandler (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/lib/adapter/adapter.js:9017:18)
      2023-06-15 21:55:07.972  - error: viessmann.0 (55242) Parameter "options" needs to be a real object but type "boolean" has been passed
      2023-06-15 21:55:07.995  - warn: viessmann.0 (55242) Terminated (UNCAUGHT_EXCEPTION): Without reason
      2023-06-15 21:55:08.596  - error: host.iobroker instance system.adapter.viessmann.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
      2023-06-15 21:55:08.596  - info: host.iobroker Restart adapter system.adapter.viessmann.0 because enabled
      

      Der Adapter wird dann in einer Endlosschleife neu gestartet.

      lg Olli

      posted in ioBroker Allgemein
      E
      ehome
    • RE: Admin Error

      @paul53 said in Admin Error:

      hm-rpc.2.0001D3C9A4F7E1.6.POWER

      also gut - ich hab's immer noch nicht kapiert, deshalb liste ich noch mal alles auf + den Datenpunk selber, falls es das ist was ihr meint.....

      Ich habe den Alias übrigens heute Mittag dann mal gelöscht und wieder angelegt. Fehler tritt aber identisch wieder auf.

      Das steht in der Fehlermeldung:

      Alias subscription error. Please check your alias definitions: sourceId=hm-rpc.2.0001D3C9A4F7E1.6.POWER, sourceObj={"type":"state","common":{"name":"Waschmaschine:6.POWER","role":"value.power","def":0,"type":"number","read":true,"write":false,"min":0,"max":163830,"unit":"W"},"native":{"MIN":0,"UNIT":"W","OPERATIONS":5,"MAX":163830,"FLAGS":1,"ID":"POWER","TYPE":"FLOAT","DEFAULT":0,"CONTROL":"POWERMETER_PSM.POWER"},"from":"system.adapter.hm-rega.0","user":"system.user.admin","ts":1677698190317,"_id":"hm-rpc.2.0001D3C9A4F7E1.6.POWER","acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
      

      Das ist der Alias:

      {
        "type": "state",
        "common": {
          "name": "Waschmaschine",
          "role": "value.power",
          "type": "number",
          "unit": "W",
          "max": 163830,
          "read": true,
          "write": false,
          "alias": {
            "id": "hm-rpc.2.0001D3C9A4F7E1.6.POWER"
          },
          "custom": {
            "influxdb.2": {
              "enabled": true,
              "storageType": "Number",
              "aliasId": "",
              "debounceTime": 0,
              "blockTime": 0,
              "changesOnly": true,
              "changesRelogInterval": 0,
              "changesMinDelta": 0,
              "ignoreBelowNumber": "",
              "disableSkippedValueLogging": false,
              "enableDebugLogs": false,
              "debounce": 1000
            },
            "lovelace.0": {
              "enabled": true,
              "entity": "sensor",
              "name": "power_Waschmaschine",
              "attr_unit_of_measurement": "W"
            }
          }
        },
        "_id": "alias.0.power.Waschmaschine",
        "native": {},
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        },
        "from": "system.adapter.admin.0",
        "user": "system.user.admin",
        "ts": 1680964960612
      }
      

      Das ist der Datenpunkt:

      {
        "type": "state",
        "common": {
          "name": "Waschmaschine:6.POWER",
          "role": "value.power",
          "def": 0,
          "type": "number",
          "read": true,
          "write": false,
          "min": 0,
          "max": 163830,
          "unit": "W"
        },
        "native": {
          "MIN": 0,
          "UNIT": "W",
          "OPERATIONS": 5,
          "MAX": 163830,
          "FLAGS": 1,
          "ID": "POWER",
          "TYPE": "FLOAT",
          "DEFAULT": 0,
          "CONTROL": "POWERMETER_PSM.POWER"
        },
        "from": "system.adapter.hm-rega.0",
        "user": "system.user.admin",
        "ts": 1677698190317,
        "_id": "hm-rpc.2.0001D3C9A4F7E1.6.POWER",
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        }
      }
      
      posted in ioBroker Allgemein
      E
      ehome
    • RE: Admin Error

      @homoran hmm, bin mir nicht sicher was du da meinst ......

      posted in ioBroker Allgemein
      E
      ehome
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo