Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    W
    • Profile
    • Following 1
    • Followers 0
    • Topics 1
    • Posts 355
    • Best 19
    • Groups 2

    Willi-Wunder

    @Willi-Wunder

    Starter

    22
    Reputation
    35
    Profile views
    355
    Posts
    0
    Followers
    1
    Following
    Joined Last Online

    Willi-Wunder Follow
    Pro Starter

    Best posts made by Willi-Wunder

    • RE: [SourceAnalytix 0.4.8-Final] Released !

      @martybr sagte in [SourceAnalytix 0.4.8-Final] Released !:

      @david-g Ich habe den Adapter heute Nacht um 00:01 per Script neu gestartet.
      @Fichte

      Ihr könnt den Neustart jedes Jahr auch im Adpater selbst planen lassen, hier Expertenmodus einschalten und dann die Zeit hier hinterlegen. Dann klappt es jedes Jahr ohne Probleme und man braucht dazu kein Skript.
      Source.jpg

      posted in Tester
      W
      Willi-Wunder
    • RE: [SourceAnalytix 0.4.8-Final] Released !

      @hg6806
      Super das es jetzt funktioniert, das ist ja die Hauptsache. Wenn du dein Problem und deine Lösung dazu mal kurz zusammen fassen willst, kann ich meinen Betrag oben erweitern, ist vielleicht auch für andere nützlich und ist nicht so über mehrere Beiträge verteilt. Nur ein Vorschlag um ggf. Dutchman etwas zu entlasten 🙂
      Oder man müßte das Englische Troubleshooting mal ins deutsche übersetzen, glaub da tun sich auch einige schwer daraus die richtige Lösung zu finden, oder was meint Ihr?

      posted in Tester
      W
      Willi-Wunder
    • RE: Anfrage Tahoma/Somfy IO Adapter

      Hi,
      hab leider auch das Problem, dass der Adapter nicht mehr läuft. Ging bis vor ein paar Wochen eigentlich noch. Weiß nicht, ob es evtl an der neuen Firmware der Tahoma Box liegt, kamen in letzter Zeit ein paar, aktuell Tahoma Version 2021.2.4-17. Mein log sieht so aus:

      tahoma.0
      	2021-07-17 22:00:16.391	info	Login failed three times, waiting 2 minutes before retrying.
      tahoma.0
      	2021-07-17 22:00:16.389	warn	error during tahomalink request: undefined ->401 retry login
      tahoma.0
      	2021-07-17 22:00:16.180	warn	error during tahomalink request: undefined ->401 retry login
      tahoma.0
      	2021-07-17 22:00:16.096	warn	error during tahomalink request: undefined ->401 retry login
      tahoma.0
      	2021-07-17 22:00:16.018	warn	error during tahomalink request: undefined ->401 retry login
      tahoma.0
      	2021-07-17 22:00:15.924	warn	error during tahomalink request: undefined ->401 retry login
      tahoma.0
      	2021-07-17 22:00:15.674	info	[INFO] Configured polling interval: 20000
      tahoma.0
      	2021-07-17 22:00:15.637	info	[START] Starting adapter tahoma v0.3.3
      tahoma.0
      	2021-07-17 22:00:15.597	info	starting. Version 0.3.3 in /opt/iobroker/node_modules/iobroker.tahoma, node: v12.22.2, js-controller: 3.3.14
      host.raspberrypi
      	2021-07-17 22:00:13.926	info	instance system.adapter.tahoma.0 started with pid 2008
      host.raspberrypi
      	2021-07-17 21:59:43.880	info	Restart adapter system.adapter.tahoma.0 because enabled
      host.raspberrypi
      	2021-07-17 21:59:43.879	error	instance system.adapter.tahoma.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
      tahoma.0
      	2021-07-17 21:59:43.804	warn	Cannot get view: Connection is closed.
      tahoma.0
      	2021-07-17 21:59:43.803	warn	Cannot get view: Connection is closed.
      tahoma.0
      	2021-07-17 21:59:43.648	warn	get state error: DB closed
      tahoma.0
      	2021-07-17 21:59:42.914	warn	Terminated (UNCAUGHT_EXCEPTION): Without reason
      tahoma.0
      	2021-07-17 21:59:42.913	info	terminating
      tahoma.0
      	2021-07-17 21:59:42.670	error	The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.669	error	Error: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level! at validateSetStateObjectArgument (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6004:23) at Adapter.setState (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6091:21) at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.tahoma/lib/tahoma.js:659:23) at processImmediate (internal/timers.js:463:21)
      tahoma.0
      	2021-07-17 21:59:42.668	error	unhandled promise rejection: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.667	error	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().
      tahoma.0
      	2021-07-17 21:59:42.621	error	The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.620	error	Error: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, unroll_end_limit_state, security_level! at validateSetStateObjectArgument (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6004:23) at Adapter.setState (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6091:21) at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.tahoma/lib/tahoma.js:659:23) at processImmediate (internal/timers.js:463:21)
      tahoma.0
      	2021-07-17 21:59:42.620	error	unhandled promise rejection: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.619	error	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().
      tahoma.0
      	2021-07-17 21:59:42.576	error	The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.576	error	Error: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level! at validateSetStateObjectArgument (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6004:23) at Adapter.setState (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6091:21) at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.tahoma/lib/tahoma.js:659:23) at processImmediate (internal/timers.js:463:21)
      tahoma.0
      	2021-07-17 21:59:42.573	error	unhandled promise rejection: The state contains the forbidden properties discreet_mode_speed, roll_end_limit_state, setting_state, open_level, soft_start, current_position, soft_stop, nominal_mode_speed, smart_protect, unroll_end_limit_state, security_level!
      tahoma.0
      	2021-07-17 21:59:42.572	error	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().
      tahoma.0
      	2021-07-17 21:59:41.840	info	[INFO] Configured polling interval: 20000
      tahoma.0
      	2021-07-17 21:59:41.761	info	[START] Starting adapter tahoma v0.3.3
      tahoma.0
      	2021-07-17 21:59:41.729	info	starting. Version 0.3.3 in /opt/iobroker/node_modules/iobroker.tahoma, node: v12.22.2, js-controller: 3.3.14
      

      Anmeldung über die Web Oberfläche ist gerade auch gesperrt, (Too many requests, try again later)
      Hab schon gelesen, dass dieser Adapter leider nicht mehr gepflegt wird, vielleicht kann aber jemand anderes noch helfen, würde mich auch sehr freuen. Bei Somfy wird auch aktuell viel geändert, bis ende des Jahres soll es eine einheitliche App (Android - iOS) gegeben mit der die Box auch voll konfiguriert werden werden kann. Tahoma Premium Box und neue Switch Box soll eine App bekommen.....nur als Info wen es interessiert 🙂

      Hab den Adapter schon mal paar Stunden ausgeschaltet gehabt und dann nochmal probiert, ging auch nicht. Auch eine Neuinstallation blieb erfolglos.

      Gruß Willi

      posted in ioBroker Allgemein
      W
      Willi-Wunder
    • RE: [Major Update] SourceAnalytix v0.4.7-beta.0 released !

      @ostseereiter
      @babl
      Hi, habe genau das gleiche Problem mit dem Adapter. Hab ein Skript gefunden, welche meine Wünsche bisher alle erfüllt. Hoffe ich darf es hier posten, soll ja schließlich erstmal helfen 🙂

      //jshint maxerr:1000
      // https://github.com/hdering/homematic_stromverbrauch_protokollieren
      
      //----------------------------------------------------------------------------//
      
      // Version: 1.3.3
      
      //----------------------------------------------------------------------------//
      // +++++++++  USER ANPASSUNGEN ++++++++++++++++++++++++
      
      // debug logging
      var logging = false;
      
      // Aktivieren der History Instanz
      var enable_history = false;
      
      // history Instanz
      var instance_history = 'history.0';
      
      // Geräte können unterschiedliche Preise haben
      var enable_unterschiedlichePreise = false;
      
      // Speichern der Werte in zusätzlichen Objekten.
      // Wenn 0, dann deaktiviert
      var Tag_Anzahl_Werte_in_der_Vergangenheit       = 7;
      var Woche_Anzahl_Werte_in_der_Vergangenheit     = 4;
      var Monat_Anzahl_Werte_in_der_Vergangenheit     = 12;
      var Quartal_Anzahl_Werte_in_der_Vergangenheit   = 4;
      var Jahr_Anzahl_Werte_in_der_Vergangenheit      = 2;
      
      // Grundpreis einberechnen
      var enable_Grundpreis_einberechnen = false;
      
      var instance    = '0';
      var instanz     = 'javascript.' + instance + '.';
      
      // Pfad innerhalb der Instanz
      var pfad        = 'Verbrauchszaehler.';
      
      var default_unit = 'Wh';
      var default_unit_kilo = 'kWh';
      
      // Diese Teile werden aus den Gerätenamen entfernt
      var blacklist   = [':1', ':2', ':3', ':4', ':5', ':6', ':7', ':8'];
      
      var AnzahlKommastellenKosten = 2;
      var AnzahlKommastellenVerbrauch = 3;
      var AnzahlKommastellenZaehlerstand = 3;
      
      var KumulierterWertIstBereitsInKilo = false;
      
      var eigeneDatenpunkte = [
          
          // Beispiel:
          // ['Datenpunkt', 'Aliasname', 'Einheit kumulierter Wert', 'Einheit berechnete Werte (kilo/1000)' ],
          
      
        [ 'shelly.0.SHEM-3#84CCA8AD304A#1.Total.ConsumedPower'/*Total consumed energy*/,'Verbrauch_Waermepumpe', 'Wh', 'kWh' ],
      
          // [ 'hm-rpc.2.NEQ0861663.1.ENERGY_COUNTER', 'Stromzaehler:1.ENERGY_COUNTER', 'Wh', 'kWh' ],
          // [ 'javascript.1.MeinSonoffGeraet1', 'Strom.Sonoff.MeinSonoffGeraet1', 'Wh', 'kWh' ],
          // [ 'javascript.1.MeinSonoffGeraet2', 'Strom.Sonoff.MeinSonoffGeraet2', 'kWh', 'kWh' ],
          // [ 'javascript.1.MeineGas1', 'Gas.MeinGaszaehler1', 'm3', 'm3' ],
          // [ 'javascript.1.MeineGas2', 'Gas.MeinGaszaehler2', 'm3', 'm3' ],
      ];
      
      // Pushmeldung
      function send_message(text) {
          
          // Hier können die Pushmeldung über alle möglichen Wege verschickt werden.
          
          //console.log(text);
          
          //sendTelegram(text);
      }
      
      // ++++ ENDE USER ANPASSUNGEN ++++++++++++++++++++++++
      //----------------------------------------------------------------------------//
      
      createState(pfad + 'Preis.aktuell.Arbeitspreis', {
          name: 'Strompreis - aktueller Arbeitspreis (brutto)',
          unit: '€/' + default_unit_kilo,
          type: 'number',
          def:  0,
          min:  0
      });
      
      createState(pfad + 'Preis.aktuell.Grundpreis',  {                           
          name: 'Strompreis - aktueller Grundpreis (brutto)',
          unit: '€/Monat',
          type: 'number',
          def:  0,
          min: 0
      });
      
      //----------------------------------
      
      createState(pfad + 'Preis.neu.Arbeitspreis', {
          name: 'Strompreis - neuer Arbeitspreis ab Datum (brutto)',
          unit: '€/' + default_unit_kilo,
          type: 'number',
          def:  0,
          min:  0
      });
      
      createState(pfad + 'Preis.neu.Grundpreis',  {                           
          name: 'Strompreis - neuer Grundpreis ab Datum (brutto)',
          unit: '€/Monat',
          type: 'number',
          def:  0,
          min: 0
      });
      
      createState(pfad + 'Preis.neu.Datum',  {                           
          name: 'Strompreis und Grundpreis ab folgendem Datum zur Berechnung heranziehen (Beispiel 01.01.2019)',
          type: 'string',
          def: "01.01.1970",
      });
      
      createState(pfad + 'Preis.neu.PreisaenderungDurchgefuehrt', false, {
        read: true, 
        write: true, 
        type: "boolean", 
        def: false
      });
      
      //----------------------------------------------------------------------------//
      
      var cacheSelectorStateMeter  = $('channel[state.id=*.METER]');
      var cacheSelectorStateEnergyCounter  = $('channel[state.id=*.ENERGY_COUNTER$]');
      
      //----------------------------------------------------------------------------//
      
      function parseObjects(id) {
          var obj = getObject(id);
      
          return entferneDatenpunkt(obj.common.name);
      }
      
      function setRecognizedChange(type, anzahl) {
          
          cacheSelectorStateMeter.each(function (id, i) {
              var geraetename = parseObjects(id);
      
              rotateVerbrauchUndKosten(geraetename, type, anzahl);
              
              resetVerbrauchUndKosten(geraetename, type);
              
              schreibeZaehlerstand(geraetename, type);
          });
      
          cacheSelectorStateEnergyCounter.each(function (id, i) {
              var geraetename = parseObjects(id);
      
              rotateVerbrauchUndKosten(geraetename, type, anzahl);
              
              resetVerbrauchUndKosten(geraetename, type);
              
              schreibeZaehlerstand(geraetename, type);
          });
          
          if (eigeneDatenpunkte.length > 0) {
      
              for(var i = 0; i < eigeneDatenpunkte.length; i++) {
                  var alias = eigeneDatenpunkte[i][1];
                  
                  rotateVerbrauchUndKosten(alias, type, anzahl);
                  
                  resetVerbrauchUndKosten(alias, type);
                  
                  schreibeZaehlerstand(alias, type);
              }
          }
      }
      
      //----------------------------------------------------------------------------//
      
      // Tageswechsel
      schedule("0 0 * * *", function() {
          setRecognizedChange('Tag', Tag_Anzahl_Werte_in_der_Vergangenheit);
      });
      
      // Wochenwechsel
      schedule("0 0 * * 1", function() {
          setRecognizedChange('Woche', Woche_Anzahl_Werte_in_der_Vergangenheit);
      });
      
      // Monatswechsel
      schedule("0 0 1 * *", function() {
          setRecognizedChange('Monat', Monat_Anzahl_Werte_in_der_Vergangenheit);
      });
      
      // Quartalswechsel
      schedule("0 0 1 */3 *", function() {
          setRecognizedChange('Quartal', Quartal_Anzahl_Werte_in_der_Vergangenheit);
      });
      
      // Jahreswechsel
      schedule("0 0 1 1 *", function() {
          setRecognizedChange('Jahr', Jahr_Anzahl_Werte_in_der_Vergangenheit);
      });
      
      //----------------------------------------------------------------------------//
      
      // Eigene Datenpunkte
      function pruefeEigeneDatenpunkte() {
          
          if (eigeneDatenpunkte.length > 0) {
          
              for(var i = 0; i < eigeneDatenpunkte.length; i++) {
                  
                  var datenpunkt = eigeneDatenpunkte[i][0];
                  var alias = eigeneDatenpunkte[i][1];
                  var einheit = eigeneDatenpunkte[i][2];
                  var einheit_kilo = eigeneDatenpunkte[i][3];
                  
                  if(logging) console.log("Alias:" + alias + " Datenpunkt:" + datenpunkt + " Einheit:" + einheit + " Einheit_kilo:" + einheit_kilo);
      
                  on(datenpunkt, function(obj) {
      
                      for(var i = 0; i < eigeneDatenpunkte.length; i++) {
                          
                          if(eigeneDatenpunkte[i][0] === obj.id)    
                              run(obj, eigeneDatenpunkte[i][1], eigeneDatenpunkte[i][2], eigeneDatenpunkte[i][3]);
                      }
                  });
              }
          }
      }
      
      pruefeEigeneDatenpunkte();
      
      //----------------------------------------------------------------------------//
      
      // Einlesen der aktuellen Daten vom Zähler
      function run(obj, alias, unit, unit_kilo) {
          
          if (logging) {   
              log('-------- Strommesser ---------');
              log('RegExp-Funktion ausgelöst');
              log('id:           ' + obj.id);
              log('Name:         ' + obj.common.name);   // Waschmaschine Küche:2.ENERGY_COUNTER
              log('channel ID:   ' + obj.channelId);     // hm-rpc.0.MEQ0170864.2
              log('channel Name: ' + obj.channelName);   // Waschmaschine Küche:2
              log('device ID:    ' + obj.deviceId);      // hm-rpc.0.MEQ0170864
              log('device name:  ' + obj.deviceName);    // Küche Waschmaschine
              log('neuer Wert:   ' + obj.newState.val);  // 16499.699982
              log('alter Wert:   ' + obj.oldState.val);  // 16499.699982
          }
      
          // Gerätenamen erstellen
          if (logging) log('vor der Aufbereitung: ' + obj.common.name); 
          
          var geraetename = entferneDatenpunkt(obj.common.name);
      
          if(typeof alias !== "undefined")  {
              if(logging) console.log("Es wird der Aliasname gesetzt:" + alias);
              
              geraetename = alias;
          }
          
          if (logging) log('Nach der Aufbereitung: ' + geraetename); 
          
          if(typeof geraetename !== "undefined") {
              
              //------------------------------------------------------------------------//
              
              _unit = default_unit;
              _unit_kilo = default_unit_kilo;
              
              // States erstellen (CreateStates für dieses Gerät)
              if(typeof unit !== "undefined")  {
                  _unit = unit;
              }
              
              if(typeof unit_kilo !== "undefined")  {
                  _unit_kilo = unit_kilo;
              }
              
              erstelleStates(geraetename, _unit, _unit_kilo);
              
              //------------------------------------------------------------------------//
              
              // Schreiben der neuen Werte
          
              var idKumuliert =  instanz + pfad + geraetename + '.Zaehlerstand.kumuliert';
              
              var NeustartEventuellErkannt = false;
              var NeustartSicherErkannt = false;
              
              var oldState = obj.oldState.val;
              var newState = obj.newState.val;
              var difference = newState - oldState;
          
              if(difference > 0) {
                  
                  if(oldState !== 0) {
          
                      // Kumulierten Wert mit Ist-Wert (inkl. Backup) synchronisieren
                      var newValueKumuliert = getState(idKumuliert).val + difference;
                      
                      newValueKumuliert = parseFloat(newValueKumuliert);
          
                      setState(idKumuliert, newValueKumuliert);
                      
                  } else {
                      
                      if(newState < getState(pfad + geraetename + '.config.NeustartErkanntAlterWert').val) {
          
                          NeustartSicherErkannt = true;
                      }
                  }
                  
              } else {
                  
                  // Fall 2 oder 3
                  // Irgendetwas läuft außerplanmäßig. Wert wird sicherheitshalber gespeichert und nächster Lauf abgewartet
                  NeustartEventuellErkannt = true;
                  
                  setState(pfad + geraetename + '.config.NeustartErkanntAlterWert', obj.oldState.val);
              }
              
              if(NeustartEventuellErkannt) {
                  
                  if(logging) {
                      var message =  geraetename + '\n'
                                      + 'Entweder die CCU oder Stromzähler wurden neugestartet/zurückgesetzt.\n'
                                      + 'Dieser Wert wird einmal ignoriert und auf den nächsten Wert gewartet.';
                  
                      send_message(message);
                  }
              }
              
              if(NeustartSicherErkannt) {
          
                  // zurücksetzen der Variable
                  setState(pfad + geraetename + '.config.NeustartErkanntAlterWert', 0);
                  
                  //----------------------------------------------------------------//
          
                  var message2 = geraetename + '\n'
                              + 'Der Stromzähler (' + geraetename + ') ist übergelaufen, gelöscht oder neugestartet worden (ggf. Stromausfall).\n'
                              + 'newState:' + obj.newState.val + '\n' 
                              + 'oldState:' + obj.oldState.val + '\n'
                              + 'differenz:' + difference + '\n'
                              + 'idKumuliert:' + getState(idKumuliert).val;
          
                  send_message(message2);
              }
              
              //--------------------------------------------------------------------//
      
              pruefePreisaenderung();
              
              if(enable_unterschiedlichePreise)
                  pruefePreisaenderung(geraetename);
              
              var idStrompreis = instanz + pfad + 'Preis.aktuell.Arbeitspreis';
              var idGrundpreis = instanz + pfad + 'Preis.aktuell.Grundpreis';
              
              // aktualisiere den Verbrauch und die Kosten
              if(KumulierterWertIstBereitsInKilo)
                  _zaehler    = (getState(idKumuliert).val).toFixed(AnzahlKommastellenZaehlerstand);
              else
                  _zaehler    = (getState(idKumuliert).val / 1000).toFixed(AnzahlKommastellenZaehlerstand);
              
              _preis      = getState(idStrompreis).val;
              _grundpreis = getState(idGrundpreis).val;
              
              // Wenn das Gerät einen eigenen Strompreis / Grundpreis hat
              if(enable_unterschiedlichePreise) {
                  
                  if(getState(instanz + pfad + geraetename + '.eigenerPreis.aktuell.Arbeitspreis').val > 0) {
                      _preis = getState(instanz + pfad + geraetename + '.eigenerPreis.aktuell.Arbeitspreis').val;
      
                      if (logging) console.log("Das Gerät:" + geraetename + " hat eigenen Strompreis: " + _preis);
                  }
                  
                  if(getState(instanz + pfad + geraetename + '.eigenerPreis.aktuell.Grundpreis').val > 0) {
                      _grundpreis = getState(instanz + pfad + geraetename + '.eigenerPreis.aktuell.Grundpreis').val;
                      
                      if (logging) console.log("Das Gerät:" + geraetename + " hat eigenen Grundpreis: " + _grundpreis);
                  }
              }
      
              berechneVerbrauchUndKosten(geraetename, _zaehler, _preis, _grundpreis); // in kWh
      
              if (logging) log('------------ ENDE ------------');
              
          } else {
              
              var message3 = 'Fehler beim Erstellen des Gerätenamens:\n'
                          + 'obj.common.name: ' + obj.common.name;
              
              send_message(message3);
          }
      }
      
      cacheSelectorStateMeter.on(function(obj) {
         run(obj);
      });
      
      cacheSelectorStateEnergyCounter.on(function(obj) {
         run(obj);
      });
      
      //----------------------------------------------------------------------------//
      
      function entferneDatenpunkt(geraet) {
          
          var rueckgabe = geraet;
          
          // ":2.ENERGY_COUNTER" --> ".ENERGY_COUNTER"
          if (geraet.indexOf(".ENERGY_COUNTER") != -1) {
              
              rueckgabe = geraet.substring(0, geraet.indexOf(".ENERGY_COUNTER"));
              
          } else if (geraet.indexOf(".METER") != -1) {
              
              rueckgabe = geraet.substring(0, geraet.indexOf(".METER"));
          }
          
          if (logging) log('entferneDatenpunkt - rueckgabe1:' + rueckgabe);
      
          // Rückgabe sollte keine Sonderzeichen oder Leerzeichen enthalten. Wenn doch, werden die entfernt oder ersetzt
      
          try {
              rueckgabe = checkBlacklist(rueckgabe);
          }
          catch(err) {
              if (logging) log('entferneDatenpunkt - rueckgabe2:' + rueckgabe + ' error:' + err);
          }
          finally {
              if (logging) log('entferneDatenpunkt - rueckgabe2:' + rueckgabe);
          }
      
          try {
              if (rueckgabe.charAt(rueckgabe.length - 1) == "-") rueckgabe = rueckgabe.substr(0, rueckgabe.length - 1);
              if (rueckgabe.charAt(rueckgabe.length - 1) == "\\") rueckgabe = rueckgabe.substr(0, rueckgabe.length - 1);
              if (rueckgabe.charAt(rueckgabe.length - 1) == ":") rueckgabe = rueckgabe.substr(0, rueckgabe.length - 1);
          }
          catch(err) {
              if (logging) log('entferneDatenpunkt - rueckgabe3:' + rueckgabe + ' error:' + err);
          }
          finally {
              if (logging) log('entferneDatenpunkt - rueckgabe3:' + rueckgabe);
          }
          
          // per Regexp Leerzeichen entfernen
          try {
              rueckgabe = rueckgabe.replace(/\s/g, "");
          }
          catch(err) {
              if (logging) log('entferneDatenpunkt - rueckgabe4:' + rueckgabe + ' error:' + err);
          }
          finally {
              if (logging) log('entferneDatenpunkt - rueckgabe4:' + rueckgabe);
          }
      
          return rueckgabe;
      }
      
      function checkBlacklist(name) {
          
          var _name = "";
          
          if (blacklist.length > 0) {
      
              for(var i = 0; i < blacklist.length; i++) {
                
                  if (name.indexOf(blacklist[i]) != -1) {
      
                      // Zeichenketten, die in der Blacklist stehen, aus dem Namen löschen
                      _name = name.substring(0, name.indexOf(blacklist[i]));
                  }
              }
      
              if(_name === "") {
                  return name;
              } else {
                  return _name;
              }
          
          } else return (name);
      }
      
      function schreibeZaehlerstand(geraet, zeitraum) { 
          
          var idKumuliert =    instanz + pfad + geraet + '.Zaehlerstand.kumuliert',
              idZaehlerstand = instanz + pfad + geraet + '.Zaehlerstand.' + zeitraum;
          
          // Zählerstand für übergebene Zeitraum und das Gerät in Wh auslesen und in kWh speichern (also durch 1000)
          
          if(KumulierterWertIstBereitsInKilo)
              setState(idZaehlerstand, parseFloat( (getState(idKumuliert).val).toFixed(AnzahlKommastellenZaehlerstand)) );  
          else
              setState(idZaehlerstand, parseFloat( (getState(idKumuliert).val / 1000).toFixed(AnzahlKommastellenZaehlerstand)) ); 
      
          if (logging) log('Zählerstände für das Gerät ' + geraet + ' (' + zeitraum + ') in Objekten gespeichert');
      }
      
      function rotateVerbrauchUndKosten(geraet, zeitraum, anzahl) {
      
          // Verbrauch
          if(anzahl > 0) {
              
              for(var i = anzahl; i >= 0; i--) {
                  
                  var j = i;
                  
                  j++;
                  
                  if(getObject(instanz + pfad + geraet + '.Verbrauch._' + zeitraum + '.' + zeitraum + '_' + j)) {
                      
                      if(i === 0)
                          setState(instanz + pfad + geraet + '.Verbrauch._' + zeitraum + '.' + zeitraum + '_' + j, getState(instanz + pfad + geraet + '.Verbrauch.' + zeitraum).val);
                      else
                          setState(instanz + pfad + geraet + '.Verbrauch._' + zeitraum + '.' + zeitraum + '_' + j, getState(instanz + pfad + geraet + '.Verbrauch._' + zeitraum + '.' + zeitraum + '_' + i).val);
                  }
              }
          }
          
          // Kosten
          if(anzahl > 0) {
              
              for(var i = anzahl; i >= 0; i--) {
                  
                  var j = i;
                  
                  j++;
                  
                  if(getObject(instanz + pfad + geraet + '.Kosten._' + zeitraum + '.' + zeitraum + '_' + j)) {
                      
                      if(i === 0)
                          setState(instanz + pfad + geraet + '.Kosten._' + zeitraum + '.' + zeitraum + '_' + j, getState(instanz + pfad + geraet + '.Kosten.' + zeitraum).val);
                      else
                          setState(instanz + pfad + geraet + '.Kosten._' + zeitraum + '.' + zeitraum + '_' + j, getState(instanz + pfad + geraet + '.Kosten._' + zeitraum + '.' + zeitraum + '_' + i).val);
                  }
              }
          }
      }
      
      function resetVerbrauchUndKosten(geraet, zeitraum) {
          
          // Reset der Stromkosten für den übergebenen Zeitraum
          // Reset des Stromverbrauchs für den übergebenen Zeitraum 
          setState(instanz + pfad + geraet + '.Kosten.' + zeitraum, 0);     
          setState(instanz + pfad + geraet + '.Verbrauch.' + zeitraum, 0);
          
          if (logging) log('Stromkosten und Stromverbrauch für das Gerät ' + geraet + ' (' + zeitraum + ') zurückgesetzt');
      } 
      
      function berechneVerbrauchUndKosten(geraet, zaehler, preis, grundpreis) {                      
          
          // bei jedem eingehenden Wert pro Gerät
      
          if(preis === 0) {
          
              var message0 = 'Achtung!' + '.\n'
                          + 'Es wurde noch kein Arbeitspreis angegeben.' + '\n' 
                          + 'Ohne Arbeitspreis kann das Skript keine Berechnungen durchführen.' + '\n'
                          + 'Diese Information ist zwingend notwendig!';
              
              log(message0, 'error');
              
          } else {
          
              var _grundpreis = 0;
              
              if(enable_Grundpreis_einberechnen) {
          
                  _grundpreis = grundpreis * 12 / 365;
                  
                  _grundpreis = parseFloat(_grundpreis.toFixed(3));
              }
              
              grundpreis_tag      = _grundpreis;
              grundpreis_woche    = _grundpreis * 7;
              grundpreis_monat    = _grundpreis * 30; 
              grundpreis_quartal  = _grundpreis * 90;
              grundpreis_jahr     = _grundpreis * 365;
          
              // Tag [Verbrauchskosten = (Zähler_ist - Zähler_Tagesbeginn) * Preis ] --- zaehler muss immer größer sein als Tages, Wochen, etc.-Wert
              setState(instanz + pfad + geraet + '.Kosten.Tag',        parseFloat( (((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis) + grundpreis_tag).toFixed(AnzahlKommastellenKosten) ) );  // Kosten an diesem Tag in €
              
              // Woche
              setState(instanz + pfad + geraet + '.Kosten.Woche',      parseFloat( (((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis) + grundpreis_woche).toFixed(AnzahlKommastellenKosten) ) );
              
              // Monat
              setState(instanz + pfad + geraet + '.Kosten.Monat',      parseFloat( (((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis) + grundpreis_monat).toFixed(AnzahlKommastellenKosten) ) );
              
              // Quartal
              setState(instanz + pfad + geraet + '.Kosten.Quartal',    parseFloat( (((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis) + grundpreis_quartal).toFixed(AnzahlKommastellenKosten) ) );
              
              // Jahr
              setState(instanz + pfad + geraet + '.Kosten.Jahr',       parseFloat( (((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis) + grundpreis_jahr).toFixed(AnzahlKommastellenKosten) ) );  
              
              if (logging) log('Stromkosten (' + geraet + ') aktualisiert');
          }
          
          // Verbrauch berechnen
          
          // Tag [Verbrauchskosten = (Zähler_ist - Zähler_Tagesbeginn) * Preis ] --- zaehler muss immer größer sein als Tages, Wochen, etc.-Wert
          setState(instanz + pfad + geraet + '.Verbrauch.Tag',     parseFloat(   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(AnzahlKommastellenVerbrauch) ) );           // Verbrauch an diesem Tag in kWh
      
          // Woche
          setState(instanz + pfad + geraet + '.Verbrauch.Woche',   parseFloat(   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(AnzahlKommastellenVerbrauch) ) );
      
          // Monat
          setState(instanz + pfad + geraet + '.Verbrauch.Monat',   parseFloat(   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(AnzahlKommastellenVerbrauch) ) );
      
          // Quartal
          setState(instanz + pfad + geraet + '.Verbrauch.Quartal', parseFloat(   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(AnzahlKommastellenVerbrauch) ) );
      
          // Jahr
          setState(instanz + pfad + geraet + '.Verbrauch.Jahr',    parseFloat(   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(AnzahlKommastellenVerbrauch) ) );
          
          if (logging) log('Stromverbrauch (' + geraet + ') aktualisiert');
      }
      
      function erstelleStates (geraet, _unit, _unit_kilo) {
          
          // Kumulierter Zählerstand (wird nie kleiner)
          createState(pfad + geraet + '.Zaehlerstand.kumuliert', 0, {name: 'Kumulierter Zählerstand (' + geraet + ')', type: 'number', unit: _unit });
                  
          // Zählerstand
          createState(pfad + geraet + '.Zaehlerstand.Tag',     0, {name: 'Zählerstand Tagesbeginn ('       + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Zaehlerstand.Woche',   0, {name: 'Zählerstand Wochenbeginn ('      + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Zaehlerstand.Monat',   0, {name: 'Zählerstand Monatsbeginn ('      + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Zaehlerstand.Quartal', 0, {name: 'Zählerstand Quartalsbeginn ('    + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Zaehlerstand.Jahr',    0, {name: 'Zählerstand Jahresbeginn ('      + geraet + ')', type: 'number', unit: _unit_kilo });
          
          // Verbrauch 
          createState(pfad + geraet + '.Verbrauch.Tag',        0, {name: 'Verbrauch seit Tagesbeginn ('    + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Verbrauch.Woche',      0, {name: 'Verbrauch seit Wochenbeginn ('   + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Verbrauch.Monat',      0, {name: 'Verbrauch seit Monatsbeginn ('   + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Verbrauch.Quartal',    0, {name: 'Verbrauch seit Quartalsbeginn (' + geraet + ')', type: 'number', unit: _unit_kilo });
          createState(pfad + geraet + '.Verbrauch.Jahr',       0, {name: 'Verbrauch seit Jahresbeginn ('   + geraet + ')', type: 'number', unit: _unit_kilo });
                  
          // Stromkosten
          createState(pfad + geraet + '.Kosten.Tag',           0, {name: 'Stromkosten heute ('             + geraet + ')', type: 'number', unit: '€' });
          createState(pfad + geraet + '.Kosten.Woche',         0, {name: 'Stromkosten Woche ('             + geraet + ')', type: 'number', unit: '€' });
          createState(pfad + geraet + '.Kosten.Monat',         0, {name: 'Stromkosten Monat ('             + geraet + ')', type: 'number', unit: '€' });
          createState(pfad + geraet + '.Kosten.Quartal',       0, {name: 'Stromkosten Quartal ('           + geraet + ')', type: 'number', unit: '€' });
          createState(pfad + geraet + '.Kosten.Jahr',          0, {name: 'Stromkosten Jahr ('              + geraet + ')', type: 'number', unit: '€' });
          
          // Speichern der Werte in zusätzlichen Variablen
          if(Tag_Anzahl_Werte_in_der_Vergangenheit > 0) {
              
              for(var i = 1; i <= Tag_Anzahl_Werte_in_der_Vergangenheit; i++) {
                  createState(pfad + geraet + '.Verbrauch._Tag.Tag_' + i,             0, {name: 'Verbrauch vor ' + i + ' Tag(en) ('    + geraet + ')', type: 'number', unit: _unit_kilo });
                  createState(pfad + geraet + '.Kosten._Tag.Tag_' + i,                0, {name: 'Stromkosten vor ' + i + ' Tag(en) ('  + geraet + ')', type: 'number', unit:'€'  });
              }
          }
          
          if(Woche_Anzahl_Werte_in_der_Vergangenheit > 0) {
              
              for(var i = 1; i <= Woche_Anzahl_Werte_in_der_Vergangenheit; i++) {
                  createState(pfad + geraet + '.Verbrauch._Woche.Woche_' + i,         0, {name: 'Verbrauch vor ' + i + ' Woche(n) ('    + geraet + ')', type: 'number', unit: _unit_kilo });
                  createState(pfad + geraet + '.Kosten._Woche.Woche_' + i,            0, {name: 'Stromkosten vor ' + i + ' Woche(n) ('  + geraet + ')', type: 'number', unit:'€'  });
              }
          }
          
          if(Monat_Anzahl_Werte_in_der_Vergangenheit > 0) {
      
              for(var i = 1; i <= Monat_Anzahl_Werte_in_der_Vergangenheit; i++) {
                  createState(pfad + geraet + '.Verbrauch._Monat.Monat_' + i,         0, {name: 'Verbrauch vor ' + i + ' Monat(en) ('    + geraet + ')', type: 'number', unit: _unit_kilo });
                  createState(pfad + geraet + '.Kosten._Monat.Monat_' + i,            0, {name: 'Stromkosten vor ' + i + ' Monat(en) ('  + geraet + ')', type: 'number', unit:'€'  });
              }
          }
          
          if(Quartal_Anzahl_Werte_in_der_Vergangenheit > 0) {
              
              for(var i = 1; i <= Quartal_Anzahl_Werte_in_der_Vergangenheit; i++) {
                  createState(pfad + geraet + '.Verbrauch._Quartal.Quartal_' + i,     0, {name: 'Verbrauch vor ' + i + ' Quartal(en) ('    + geraet + ')', type: 'number', unit: _unit_kilo });
                  createState(pfad + geraet + '.Kosten._Quartal.Quartal_' + i,        0, {name: 'Stromkosten vor ' + i + ' Quartal(en) ('  + geraet + ')', type: 'number', unit:'€'  });
              }
          }
          
          if(Jahr_Anzahl_Werte_in_der_Vergangenheit > 0) {
      
              for(var i = 1; i <= Jahr_Anzahl_Werte_in_der_Vergangenheit; i++) {
                  createState(pfad + geraet + '.Verbrauch._Jahr.Jahr_' + i,           0, {name: 'Verbrauch vor ' + i + ' Jahr(en) ('    + geraet + ')', type: 'number', unit: _unit_kilo });
                  createState(pfad + geraet + '.Kosten._Jahr.Jahr_' + i,              0, {name: 'Stromkosten vor ' + i + ' Jahr(en) ('  + geraet + ')', type: 'number', unit:'€'  });
              }
          }
      
          // Neustart von CCU oder Gerät erkannt
          createState(pfad + geraet + '.config.NeustartErkanntAlterWert', 0);
          
          // Gerät hat eigenen Strompreis
          if(enable_unterschiedlichePreise) {
              createState(pfad + geraet + '.eigenerPreis.aktuell.Arbeitspreis'            , { name: 'Strompreis - aktueller Arbeitspreis ab Datum (brutto)' ,     unit: '€/' + _unit_kilo,      type: 'number', def: 0 });
              createState(pfad + geraet + '.eigenerPreis.aktuell.Grundpreis'              , { name: 'Strompreis - aktueller Grundpreis ab Datum (brutto)'   ,     unit: '€/Monat',    type: 'number', def: 0 });
              createState(pfad + geraet + '.eigenerPreis.neu.Arbeitspreis'                , { name: 'Strompreis - neuer Arbeitspreis ab Datum (brutto)' ,         unit: '€/' + _unit_kilo,      type: 'number', def: 0 });
              createState(pfad + geraet + '.eigenerPreis.neu.Grundpreis'                  , { name: 'Strompreis - neuer Grundpreis ab Datum (brutto)'   ,         unit: '€/Monat',    type: 'number', def: 0 });
              createState(pfad + geraet + '.eigenerPreis.neu.Datum'                       , { name: 'Strompreis und Grundpreis ab folgendem Datum zur Berechnung heranziehen (Beispiel 01.01.2019)', def: "01.01.1970", type: 'string' });
              
              createState(pfad + geraet + '.eigenerPreis.neu.PreisaenderungDurchgefuehrt' ,     false, { read: true, write: true, type: "boolean", def: false });
          }
          
          // history bei allen Datenpunkten aktivieren
          if(enable_history) {
              enableHistory(geraet, 'Tag');
              enableHistory(geraet, 'Woche');
              enableHistory(geraet, 'Monat');
              enableHistory(geraet, 'Quartal');
              enableHistory(geraet, 'Jahr');
          }
      
          if (logging) log('States in der Instanz ' + instanz + pfad + ' erstellt');   
      }
      
      function enableHistory(geraet, zeitraum) {
      
          if(instance_history !== '') {
              
              sendTo(instance_history, 'enableHistory', {
                  id: instanz + pfad + geraet + '.Kosten.' + zeitraum,
                  options: {
                      changesOnly:  true,
                      debounce:     0,
                      retention:    31536000,
                      maxLength:    3,
                      changesMinDelta: 0.5
                  }
              }, function (result) {
                  if (result.error) {
                      if (logging) log("Fehler beim Aktivieren von History: " + result.error);
                  }
              });
              
              sendTo(instance_history, 'enableHistory', {
                  id: instanz + pfad + geraet + '.Verbrauch.' + zeitraum,
                  options: {
                      changesOnly:  true,
                      debounce:     0,
                      retention:    31536000,
                      maxLength:    3,
                      changesMinDelta: 0.5
                  }
              }, function (result) {
                  if (result.error) {
                      if (logging) log("Fehler beim Aktivieren von History: " + result.error);
                  }
              });
              
              sendTo(instance_history, 'enableHistory', {
                  id: instanz + pfad + geraet + '.Zaehlerstand.' + zeitraum,
                  options: {
                      changesOnly:  true,
                      debounce:     0,
                      retention:    31536000,
                      maxLength:    3,
                      changesMinDelta: 0.5
                  }
              }, function (result) {
                  if (result.error) {
                      if (logging) log("Fehler beim Aktivieren von History: " + result.error);
                  }
              });
          }
      }
      
      function pruefePreisaenderung(geraet) {
          
          var _Datum = "";
          var _PreisaenderungDurchgefuehrt = "";
          var _Arbeitspreis = "";
          var _Grundpreis = "";
          var _ArbeitspreisNeu = "";
          var _GrundpreisNeu = "";
          
          if(typeof geraet === "undefined") {
              
               // Default Arbeitspreis ändern
      
              _Datum                          = instanz + pfad + 'Preis.neu.Datum';
              _PreisaenderungDurchgefuehrt    = instanz + pfad + 'Preis.neu.PreisaenderungDurchgefuehrt';
              
              _Arbeitspreis       = instanz + pfad + 'Preis.aktuell.Arbeitspreis';
              _Grundpreis         = instanz + pfad + 'Preis.aktuell.Grundpreis';
              _ArbeitspreisNeu    = instanz + pfad + 'Preis.neu.Arbeitspreis';
              _GrundpreisNeu      = instanz + pfad + 'Preis.neu.Grundpreis';
              
          } else {
      
              // Arbeitspreis für Gerät ändern
              
              _Datum                          = instanz + pfad + geraet + '.eigenerPreis.neu.Datum';
              _PreisaenderungDurchgefuehrt    = instanz + pfad + geraet + '.eigenerPreis.neu.PreisaenderungDurchgefuehrt';
              
              _Arbeitspreis       = instanz + pfad + geraet + '.eigenerPreis.aktuell.Arbeitspreis';
              _Grundpreis         = instanz + pfad + geraet + '.eigenerPreis.aktuell.Grundpreis';
              _ArbeitspreisNeu    = instanz + pfad + geraet + '.eigenerPreis.neu.Arbeitspreis';
              _GrundpreisNeu      = instanz + pfad + geraet + '.eigenerPreis.neu.Grundpreis';
          }
      
          if(getObject(_Datum)) {
              
              var date = getState(_Datum).val;
              
              var Datum_Tag;
              var Datum_Monat;
              var Datum_Jahr;
      
              try {
                  var Datum = date.match(/\d{2}(\.|-)\d{2}(\.|-)\d{4}/g).toString();
                  
                  Datum_Tag = Datum.split(".")[0];
                  Datum_Monat = Datum.split(".")[1];
                  Datum_Jahr = Datum.split(".")[2];
                  
              } catch (err) {
                  console.log("Fehler beim Auslesen des Datums. Eventuell falsche Syntax? " + date + " (Error:" + err + ")");
              }
              
              newdate = new Date(Datum_Monat + " " + Datum_Tag + " " + Datum_Jahr);
      
              var today = new Date();
              today.setHours(0,0,0,0);
      
              if(today.getTime() === newdate.getTime()) {
                  
                  if(!getState(_PreisaenderungDurchgefuehrt).val) {
      
                      setState(_PreisaenderungDurchgefuehrt, true);
                      
                      var alterArbeitspreis = getState(_Arbeitspreis).val;
                      var alterGrundpreis = getState(_Grundpreis).val;
                      
                      var neuerArbeitspreis = getState(_ArbeitspreisNeu).val;
                      var neuerGrundpreis = getState(_GrundpreisNeu).val;
                      
                      setState(_Arbeitspreis, neuerArbeitspreis);
                      setState(_Grundpreis, neuerGrundpreis);
                      
                      var message =  'Preisänderung für ' + geraet + ' wurde durchgeführt:' + '\n'
                                  + 'alter Arbeitspreis:' + alterArbeitspreis + '.\n'
                                  + 'alter Grundpeis:' + alterGrundpreis + '.\n'
                                  + 'neuer Arbeitspreis:' + neuerArbeitspreis + '.\n'
                                  + 'neuer Grundpreis:' + neuerGrundpreis;
                      
                      send_message(message);
                  }
                  
              } else if(today.getTime() > newdate.getTime()) {
      
                  // Variable zurücksetzen
                  setState(_PreisaenderungDurchgefuehrt, false);
              }
          }
      }
      
      //----------------------------------------------------------------------------//
      

      Wenn dies nicht erwünscht ist, bitte löschen.

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: [SourceAnalytix 0.4.8-Final] Released !

      Esrtmal an alle hier ein riesen Respekt wie fleißig hier gearbeitet und getestet wird. Großes Kino.
      @Dutchman
      Du bist echt der Hammer, welchen Einsatz du hier an den Start bringst und dies mal ganz so nebenbei in der Freizeit. Was ist auch ganz besonders an dir schätze, hier wird jeder freundlich behandelt und immer geholfen, auch vermeintlich wiederholende Fragen freundlich beantwortet. Es gibt bei dir keine dummen Sprüche.

      Ich habe allerdings auch nicht wirklich verstanden, wo ich welche Werte eintragen muss. Ich glaube im alten Skript waren die Bezeichnungen verständlicher beschrieben, vielleicht könnte man dies mit den Beispielen hier besser erklären?
      Zählerstände.jpg

      Ich habe heute auch das aktuelle JS 3.2.7 installiert, teste die nächsten Tage auch mit, wenn ich weiß wo genau ich meine Werte eintragen muss.☺

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: [SourceAnalytix 0.4.8-Final] Released !

      @hg6806
      den cumulativValue mußt du komplett raus löschen (nicht nur den Wert, ganze Zeile) sowie das letzte Komma in der letzten Zeile zuvor. Schau dir meins nochmal in Ruhe an, steht eigentlich alles drin 😎
      Der Wert von valueAtDeviceReset kommt mir auch komisch vor, schau dir mal meine Berechnung an, steht auch drin welche Werte du hierfür hernehmen mußt.

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: [SourceAnalytix 0.4.8-Final] Released !

      @dutchman sagte in [SourceAnalytix 0.4.8-Final] Released !:

      Hehe cool

      Das wird schwierig wegen den untechnungsfactoren, aber Länge/datenverbrauch habe ich bereits vorbereitet welche Einheiten fehlen dan noch ?

      Hi Dutchman,
      wenn hier noch wünsche geäußert werden dürfen, würde ich mich über die Laufzeit in Minuten freuen 🙂

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling
      Hammer Support, mega Adapter, großes Kino. Vielen Dank 🙂

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling
      Update hat zwar wieder so lange gedauert, aber es läuft jetzt wieder. Abfragen werden ausgegeben. Alles andere werde ich auch noch testen.

      Vielen Dank. 🤗

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling sagte in Test Adapter telegram-menu v.0.9.x:

      @liv-in-sky das json muss schon vorher fertig sein, sonst ist das ein Fass ohne Boden

      Ich glaube das hier ist schon sehr speziell und die meisten wissen gar nicht wie man das eigentlich umsetzen kann, schließe mich hier auch ein. Vielleicht kann @liv-in-sky das hier mal etwas genauer erklären wie er das macht und kann damit auch ein paar Anregeungen geben, sieht auf jeden Fall sehr cool aus. An der Umsetzung werden aber dennoch einige scheitern.

      Ich glaube aber, dass so Feature wie Zeilenumbruch (\n), mehrere Abfragen hintereinander durch die Status Befehle, neue Ui mit den Sortierungen per Drag und Drop usw. mehr nutzen für die Allgemeinheit hat. Denke viele haben noch mit der allgemeinen Umsetzung zu kämpfen.

      Vielleicht können hier mal paar Beispiele mit Anregungen und Umsetzung gepostet werden. Wäre sehr hilfreich. Hab auch schon bei einigen so schöne Symbole im Telegram gesehen, wüßte gar nicht wie ich diese da rein bekomme. Gibt es hierfür eine Gallerie wo man diese raus kopieren kann?

      Finde es von @michael-roling alsbolut bemerkenswert das er mit soviel Einsatz in seiner Freizeit hier an diesem Adpater arbeitet und jeden Wunsch und Fehler postwendend erfüllt und behebt, respekt und vielen Dank. 💪

      posted in Tester
      W
      Willi-Wunder

    Latest posts made by Willi-Wunder

    • RE: Test Adapter telegram-menu v.1.6.x

      @liv-in-sky
      Hast du mal in dein Log geschaut ob du hier auch eine Fehlermeldung von Telegram bekommst? Befehle werden normal ausgeführt, hab es daher nur zufällig in meinem Log gesehen. Wenn ja, erstelle ich ein Issue dafür.

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      Bei mir kommt bei Telegram tatsächlich

      	2025-05-14 22:54:57.946	error	Failed sending [chatId - xxxxxxxxxx]: Error: ETELEGRAM: 400 Bad Request: message text is empty
      

      wenn ich einen Befehl sende. Dieser wird aber dennoch ausgeführt. Hab gerade mal die Wärmepumpe ein- und ausgeschaltet.
      Andere Status abfragen kommen ohne Fehler im Log.

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling sagte in Test Adapter telegram-menu v.1.6.x:

      Wer Lust hat den neusten Stand zu testen kann gerne einmal von Github installieren.

      So, gerade mal die neuste Version installiert damit @liv-in-sky weiß ob es mit Telegram 4.1.0 läuft. Hab jetzt gesehen, dass dieses Menü so ausgegeben wird. die Zeile Change...... sollte so nicht mit ausgegeben werden. War zumindest bisher nicht so.
      Telegram_Menu_Wasser.jpg

      Muss ich hier bei mir etwas neu anpassen oder liegt es am Code?

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @liv-in-sky
      Hi, hatte bisher Telegram Menu 2.2.1 und Telegram 4.1.0 am laufen gehabt. Hab gerade Telegram Menu auf 2.3.0 upgedatet, läuft weiterhin mit Telegram.

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling
      Hi, erstmal vielen Dank für die Weiterentwicklung 🙂
      Ist Sentry für eine bessere Fehleranalyse? Oder für was ist da genau? Sorry, sagt mir jetzt nix 😇

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @michael-roling
      Was ist eigentlich der Unterschied zwischen der Installation von NPM V2.2.0 und Github V2.1.10?

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      @liv-in-sky
      In der heutigen Zeit muss man auch für Rosa offen sein, lach....
      Ja, die weiße Schrift ist hier schlecht lesbar. Ich wußte auch nicht, das hier der Sprung vom letzten Menü angezeigt wird.

      posted in Tester
      W
      Willi-Wunder
    • RE: [SourceAnalytix 0.4.8-Final] Released !

      @crunchip sagte in [SourceAnalytix 0.4.8-Final] Released !:

      @marty56 wie kommst du darauf, daß er nicht mehr daran arbeitet?
      Dieser Adapter wird mittels Typescript von grundauf neu entwickelt.
      Wann er in den Startlöchern steht kann ich dir allerdings nicht beantworten.

      @Dutchman
      Wünsche euch allen erstmal ein gesundes neues Jahr. 🙂
      Kannst du uns hier sagen ob du hierfür schon Zeit hattest und weitergekommen bist? Kann man etwas neues irgendwo testen und mithelfen?

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: Test Adapter telegram-menu v.1.6.x

      Wünsche euch allen erstmal ein gesundes neue Jahr 🙂

      Was für ein Kracher Update gleich zu Jahresbeginn. Das Menü ist jetzt viel übersichtlicher, gerade wenn man länger nichts mehr dran gemacht hat ist der Einstieg viel leichter. TOP. Vielen Dank dafür.

      Das Rosa finde ich allerdings etwas hart. Die aktive Spalte ist eigentlich blau, die inaktive schwarz. Habe aber trotzdem das Rosa. Ist aber nur eine optische Ansicht, weiß nicht ob es andere auch stört.

      Telegram_Menü_neu.jpg

      Gruß Willi

      posted in Tester
      W
      Willi-Wunder
    • RE: Adapter: Luxtronik 1 - Wärmepumpensteuerung

      @forelleblau
      Hi, hab wieder mal die abstürze, liegt aber vermutlich am trägen RS232 Anschluss.

      Hab leider vom programmieren wenig Plan, daher bin leider der falsche Admin.

      Nochmals vielen Dank für den Adapter und deine bisherige Unterstüzung 🙂

      posted in Entwicklung
      W
      Willi-Wunder
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo