Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    T
    • Profile
    • Following 0
    • Followers 1
    • Topics 19
    • Posts 61
    • Best 3
    • Groups 1

    TobStar

    @TobStar

    3
    Reputation
    95
    Profile views
    61
    Posts
    1
    Followers
    0
    Following
    Joined Last Online
    Website github.com/GodHunter

    TobStar Follow
    Starter

    Best posts made by TobStar

    • RE: [Vorlage] UniFi WLAN Anwesenheitskontrolle

      @homecineplexx ja ich hab's auf einer Minute stehen.

      posted in JavaScript
      T
      TobStar
    • RE: [Vorlage] UniFi WLAN Anwesenheitskontrolle

      Hab das Script nun einmal bearbeitet und nochmal abgelegt (siehe oben). Es ist nun möglich eine Zeit zu definieren nachdem eine Person als abwesend markiert wird, sprich wenn Sie z.B. länger wie 3 Minuten nicht mehr im WLAN hängt.

      posted in JavaScript
      T
      TobStar
    • [Vorlage] UniFi WLAN Anwesenheitskontrolle

      Hallo zusammen,

      hier einmal eine einfache Anwesenheitskontrolle über den UniFi Controller. Dieses wertet die im WLAN angemeldeten Geräte aus und prüft in meinem Fall ob das Handy im WLAN ist oder nicht.

      Zur Verwendung mit dem UniFi Adapter (ioBroker.unifi) von @braindead

      Die aktuellste Version auf GitHub: https://github.com/GodHunter/iobroker-unifi-presence

      // ************************************************************
      // KONFIGURATION
      //
      // pfad: Gibt an wo die Datenpunkte erstellt werden
      // json: Enthält die Konfigurationsdaten (Name d. Person, MAC Adresse des zu Überwachenden Geräts, Zeit in Minuten bis als Abwesend markiert)
      // telegram: Versendet bei Bedarf eine Nachricht via Telegram Adapter
      //
      // ************************************************************
      
      const pfad      = '0_userdata.0.Anwesenheit.';
      const json      = '{"person":[{"name":"PERSON1", "mac":"12:34:56:78:90:ab", "zeit":3},{"name":"PERSON2", "mac":"12:34:56:78:90:ab", "zeit":5}]}';
      const telegram  = true;
      
      // AB HIER KEINE ÄNDERUNGEN MEHR VORNHMEN
      on({id: 'unifi.0.info.connection', change: "any"}, function (obj){
      
          const now   = new Date();
          const array = JSON.parse(json);    
          var total   = array.person.length;
          
          createStates(array);
      
          array.person.forEach(function(person){
      
              var seen = new Date( getState('unifi.0.default.clients.'+ person.mac +'.last_seen').val );
      
              if( ( now.getTime() - seen.getTime() ) > ( person.zeit * 60000 ) ){
                  
                  if( getState(pfad + person.name).val === true) {
                      setState(pfad + person.name, false, true);
      
                      if(telegram){
                          setTimeout(function() {
                              send(person.name +' ist gegangen.');
                          }, 5000);
                      }
      
                  }
      
                  total = total -1;
      
              } else {
      
                  if( getState(pfad + person.name).val === false ) {
                      setState(pfad + person.name, true, true);
                      if(telegram) {
                          setTimeout(function() {
                              send(person.name +' ist angekommen.');
                          }, 5000);
                      }
                  }
      
              }
      
          })
      
          setState(pfad +'Anwesend', total, true);
          setState(pfad +'Abwesend', (array.person.length - total), true);
      
      });
      
      function send(nachricht){
          
          setTimeout(function() {
              nachricht = '<b>Anwesenheit</b>\r\n'+ nachricht;
          
              sendTo("telegram.0", "send", {
                  "text": [nachricht].join(''),
                  parse_mode: "HTML"
              });
      
          }, 2000);
      
      }
      
      function createStates(personen){
          
          createState(pfad +'Anwesend', 99, {read:true, write:true, type:'number', desc:'Anzahl Personen anwesend'});
          createState(pfad +'Abwesend', 99, {read:true, write:true, type:'number', desc:'Anzahl Personen abwesend'});
      
          personen.person.forEach(function(person){
              createState(pfad + person.name, false, {read:true, write:true, type:'boolean', def:false, desc:'Anwesenheitsstatus von '+ person.name});    
          });
      
      }
      
      posted in JavaScript
      T
      TobStar

    Latest posts made by TobStar

    • RE: [gelöst] Modbus-TCP Verbindung mit SAX-Batterie

      In dem Moment wo man es schreibt, fällt einem auf das der Haken bei Alias verwenden noch drin war, nimmt man den raus tut es ...
      Wichtig für alle anderen die auf diesen Post stoßen, der Port ist nicht mehr 3600, sondern 504.

      posted in ioBroker Allgemein
      T
      TobStar
    • HM-RPC keine States mehr / Zuordnung fehlt

      Hallo zusammen,

      ich habe seit geraumer Zeit Probleme mit dem HM-RPC Adapter. Ich betreibe ioBroker mit Homematic und habe 2 hm-rpc Instanzen, die 0 für alle Homematic "Classic" Geräte und die 1 für die Homematic IP Geräte.

      Bei letzterer ( hm-rpc.1 / Homematic IP ) kommt es mittlerweile 2-3x pro Woche vor, das die States der Geräte nicht mehr angezeigt und somit nicht angesprochen werden können, außerdem sind sämtliche Zuordnungen weg ( Raum / Funktion). Ich hatte die Instanz letzte Woche mal gelöscht und neu hinzugefügt, nun trat der Fehler aber leider wieder auf.

      Nach Neustart des ioBrokers sind die States dann wieder da, die Zuordnung muss dann aber wieder manuell erfolgen. Ich habe die Screenshots der Einstellungen hier mal angehangen.

      Der ioBroker läuft im Docker auf ner Synology (Buanet). Vielleicht hat jemand ne Idee woher das kommt. Das problem tritt nur beim hm-rpc.1 auf der hm-rpc.0 läuft seit Jahr und Tag sauber.

      807078d9-3777-4f22-8972-17c54ec423d9-image.png 0e691820-b81f-4c14-9565-8a39d9bc30e1-image.png

      Im Log ist zu sehen, das er die Geräte löscht ... warum auch immer.

      c18b2bf2-d1f4-4880-a891-96871db78cb6-image.png

      posted in Error/Bug
      T
      TobStar
    • RE: go-e Adapter

      @nik82 ah ok, danke.
      Hol das Auto erst nächste Woche ab und kann da erst testen. Die Wallbox kam aber gestern und da will ich das vorher schon konfiguriert haben. Dann passt die Rechnung.

      Der State Adapter_In, gibt an ob ein Kabel angeschlossen ist?

      posted in ioBroker Allgemein
      T
      TobStar
    • RE: go-e Adapter

      @nik82
      Vielen Dank für den Beitrag, der bringt etwas licht ins dunkel. Klar kann ich nur effektiv Überschuss laden, wenn ich weiß was ins Netz gespeißt wird. Hab mir dazu nen Homematic ES-TX besorgt, der ist nur nicht da. Dann kenne ich Erzeugungsleistung und aktuelle Einspeisung, daraus lässt sich dann der Hausverbrauch in etwa ermitteln.

      Wegen der Phasenumschaltung, da machst Du lediglich ab Überschuss > 1000W. Da nen kleiner Einwand 🙂
      Du brauchst ja eine gewisse Ladeleistung damit das Auto überhaupt was tut, beim Zoe glaube ich 10A, es muss also mal minimum ein Überschuss von 2,3kW da sein. Ab 7kW Überschuss kann er dann auf 3 Phasen laden.

      Sprich alles zwischen 2,3kW und 7kW Überschuss = Einphasig und darüber Dreiphasig, bis max. 16A.

      Solch eine Einstellung vermisse ich noch im Adapter, sprich lade nicht, wenn Ladestrom kleiner X. Oder habe ich da was falsch verstanden, was das laden vom eAuto angeht? Bin neu im Thema 🙂

      posted in ioBroker Allgemein
      T
      TobStar
    • RE: go-e Adapter

      Hallo zusammen,

      hab ein paar Fragen zum Umgang mit dem Adapter.
      Ich kann bei mir zwar die Leistung der Solaranlage abfragen, nicht aber den Hausverbrauch etc. funktioniert der Adapter wenn ich den Datenpunkt für "aktuelle Leistung Solar" angebe, den Rest aber leer lasse? Oder sollte ich für die anderen beiden "Verbrauch" und "Batterie" nen Dummy Datenpunkt anlegen?

      Wie macht Ihr das mit der Phasenumschaltung? Wenn Solare Leistung < 5000W dann Einphasig, else Dreiphasig?

      Ich will das meiner Frau einfach ermöglichen zu sagen, lade das Auto bis morgen komplett ( 80% ) auf. Dazu dachte ich, ich könnte feststellen ob der RFID Chip rangehalten wurde, wenn ja dann nutze Solarstrom und lade ab 01:00 Uhr aus dem Netz. Hab hier leider kein Objekt gefunden das auf das anhalten des Chips reagiert.

      posted in ioBroker Allgemein
      T
      TobStar
    • RE: [Vorlage] Solaredge Wechselrichter

      @arteck hab leider keine Ahnung von der Adapter-Entwicklung. Hatte mich mal daran versucht einen Adapter zu bauen aber das dann letztlich auch aus Zeitgründen wieder fallen gelassen. Vielleicht schaue ich es mir nochmal an und teste das irgendwann mal.

      Aktuell bin ich noch dabei das auszubauen und Batterie / Energy Meter zu integrieren.

      posted in JavaScript
      T
      TobStar
    • [Vorlage] Solaredge Wechselrichter

      Hallo zusammen,

      nun läuft auch endlich unsere PV Anlage. Wir haben einen Solaredge Wechselrichter erhalten und der fertige Adapter scheint nicht mehr gepflegt zu werden, bzw. liest er mir auch zu wenige Daten aus. Daher habe ich mich an die API gemacht und ein Script dazu erstellt.

      Dieses findet Ihr in der aktuellsten Version auf GitHub unter https://github.com/GodHunter/iobroker-solaredge dort sind auch alle Informationen zur Einrichtung beschrieben.

      Da wir leider keinen Speicher im Einsatz haben, kann ich auf andere, relevante Daten leider nicht zurückgreifen. Falls jemand also einen Wechselrichter mit Speicher im Einsatz hat, würde ich mich über einen API Key freuen um diese Daten ebenfalls ins Script einfließen zu lassen.

      Bei Fragen und Anregungen könnt Ihr gerne hier, oder besser auf GitHub schreiben.

      /**** 
       * 
       * API Version: August 2022
       * Limitations: 300 Requests per Day / 3 concurrent API Calls
       * 
      ****/
      
      const pfad      = "0_userdata.0.Systemdaten.Solaranlage.";
      const debug     = false;
      const fetch     = require('request');
      
      /******* ENDE DER KONFIGURATION *******/
      
      // Datenpunkte anlegen
      if( checkStates( pfad +'Konfiguration.APIKey' ) === false ) return true;
      
      // Aktuelle Leistung ermitteln
      schedule('*/5 4-22 * * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Die aktuelle Lesitung der Anlage "'+ plant +'" wird verarbeitet.');
              var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/power?startTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2000:00:00&endTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2023:59:00&api_key="+ apikey;
      
              
              fetch( url , function ( err, state, body ){
          
                  if (err) log( "Fehler aufgetreten: " + err, "error" );
                  else{
                      
                      var data = JSON.parse( body );
                      data = data.power.values.filter(function(jsonObject) {
                          return jsonObject.value != null;
                      });
      
                      var l = data.length -1;
                      data = ( data[l].value / 1000 ).toFixed(2);
      
                      if( debug ) log( 'Die Anlage erzeugt derzeit '+ Number( data ) +' kW.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jetzt', Number( data ), true );
      
                      //Ermittle maximale Leistung Heute
                      if( data > getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val ) {
                          if( debug ) log( 'Die maximale Leistung heute beträgt '+ Number( data ) +' kW.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', Number( data ), true );
                      }
                      
                  }
              });
      
          });
      
      });
      
      //Energieertrag ermitteln
      schedule('*/15 4-22 * * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Der Energieertrag der Anlage "'+ plant +'" wird verarbeitet.');
      
              let url = new Object();
              
              url['heute']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=DAY&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&api_key="+ apikey;
              url['monat']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=MONTH&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.ltm +"&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-01&api_key="+ apikey;
              url['jahr']     = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=YEAR&endDate="+ Zeit.jahr +"-12-31&startDate="+ Zeit.jahr +"-01-01&api_key="+ apikey;
      
              // Heutige Erzeugung
              fetch( url.heute , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat heute '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Heute', Number( data ), true );
                  }
              });
              
              // Monatliche Erzeugung
              fetch( url.monat , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat diesen Monat '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Monat', Number( data ), true );
                  }
              });
              
              // Jährliche Erzeugung
              fetch( url.jahr , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat dieses Jahr '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jahr', Number( data ), true );
                  }
              });        
      
          });
      
      });
      
      // Umweltbilanz ermitteln
      schedule('0 */2 4-22 * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Die Umweltbilanz der Anlage "'+ plant +'" wird verarbeitet.');
              var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/envBenefits?systemUnits="+ unit.api +"&api_key="+ apikey
              
              fetch( url , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      var co2     = data.envBenefits.gasEmissionSaved.co2.toFixed(2);
                      var trees   = data.envBenefits.treesPlanted.toFixed(2);
      
                      if(debug) log( 'Die Anlage hat bislang '+ co2 +' '+ unit.unit +' eingespart.' );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt', Number( co2 ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Heute', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr' ).val ), true );
      
                      if(debug) log( 'Das enspricht einer Anzahl von '+ trees +' Bäumen.' );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt', Number( trees ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Heute', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr' ).val ), true );
                  }
              });
      
          })
      
      });
      
      //Systemdaten ermitteln
      function systemdaten(){
      
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          if( apikey !== 0 ){
      
              const url = "https://monitoringapi.solaredge.com/sites/list?size=5&searchText=Lyon&sortProperty=name&sortOrder=ASC&api_key="+ apikey;
      
              fetch( url , function ( err, state, body ){
                  
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
      
                      data.sites.site.forEach( function(anlage){
      
                          if( existsState( pfad +'Anlagen.'+ anlage['id'] +'.Name' ) === false ) log( 'Die Anlage "'+ anlage['name'] +'" ( ID: '+ anlage['id'] +' ) wird erstellt.' );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Name', anlage['name'], {read: true, write: false, type: 'string', desc: 'Bezeichnung der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.AccountID', anlage['accountId'], {read: true, write: false, type: 'string', desc: 'Konto ID'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Status', anlage['status'], {read: true, write: false, type: 'string', desc: 'Kontostatus'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.kWp', anlage['peakPower'], {read: true, write: false, unit: 'kWp', type: 'string', desc: 'Installierte Leistung'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Update', anlage['lastUpdateTime'], {read: true, write: false, type: 'string', desc: 'Letzte aktualisierung der Daten'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Waehrung', anlage['currency'], {read: true, write: false, type: 'string', desc: 'Angegebene Währung'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Installationsdatum', anlage['installationDate'], {read: true, write: false, type: 'string', desc: 'Installationsdatum der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Bemerkungen', anlage['notes'], {read: true, write: false, type: 'string', desc: 'Bemerkungen zur Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Typ', anlage['type'], {read: true, write: false, type: 'string', desc: 'Anlagentyp'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Oeffentlich', anlage['publicSettings'].isPublic, {read: true, write: false, type: 'boolean', desc: 'Anlage öffentlich einsehbar'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Land', anlage['location'].country, {read: true, write: false, type: 'string', desc: 'Land in dem sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Stadt', anlage['location'].city, {read: true, write: false, type: 'string', desc: 'Stadt in der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse', anlage['location'].address, {read: true, write: false, type: 'string', desc: 'Adresse an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse2', anlage['location'].address2, {read: true, write: false, type: 'string', desc: 'Adresse 2 an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Postleitzahl', anlage['location'].zip, {read: true, write: false, type: 'string', desc: 'Postleitzahl an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Zeitzone', anlage['location'].timeZone, {read: true, write: false, type: 'string', desc: 'Zeitzone in der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Laendercode', anlage['location'].countryCode, {read: true, write: false, type: 'string', desc: 'Ländercode an der sich die Anlage befindet'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Hersteller', anlage['primaryModule'].manufacturerName, {read: true, write: false, type: 'string', desc: 'Hersteller der Solarmodule'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Modelbezeichnung', anlage['primaryModule'].modelName, {read: true, write: false, type: 'string', desc: 'Modelbezeichnung der Solarmodule'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Leistung', anlage['primaryModule'].maximumPower, {read: true, write: false, unit: 'W', type: 'number', desc: 'Maximale Leistung eines Moduls'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Temperaturkoeffizient', anlage['primaryModule'].temperatureCoef, {read: true, write: false, unit: '%', type: 'number', desc: 'Temperaturkoeffizient eines Moduls'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Bild', anlage['uris'].SITE_IMAGE, {read: true, write: false, type: 'string', desc: 'Bild der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Details', anlage['uris'].DETAILS, {read: true, write: false, type: 'string', desc: 'Link zu den Details'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Uebersicht', anlage['uris'].OVERVIEW, {read: true, write: false, type: 'string', desc: 'Link zur Übersicht'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jetzt', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Aktuelle Leistung'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Heute', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Heute erzeugte Energie'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Monat', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Diesen Monat erzeugte Energie'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jahr', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Dieses Jahr erzeugte Energie'});
                              
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Heute', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Heute'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Gestern', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Gestern'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Gesamt', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Heute', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Monat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Jahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Gesamt', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Heute', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Monat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Jahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vortag', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume Gestern'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vortag', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 Gestern'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vormonat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume vorigen Monats'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vormonat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 vorigen Monats'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vorjahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume voriges Jahr'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vorjahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 voriges Jahr'});
      
                      });
      
                  }
      
              });
      
              // Reset Anlagen einlesen
              if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) setState( pfad +'Konfiguration.AnlagenEinlesen', false, true );
      
          } else log( 'Es wurde kein API Schlüssel angegeben.', "error" );
      
      }
      
      //Datum und Uhrzeit
      function getTime(){
          
          let data = new Object();
          var d = new Date();
      
          data['stunde']  = ( '0'+ d.getHours() ).substr(-2);
          data['minute']  = ( '0'+ d.getMinutes() ).substr(-2);
          data['sekunde'] = ( '0'+ d.getSeconds() ).substr(-2);;
          data['tag']     = d.getDate();
          data['monat']   = ( '0'+ ( d.getMonth() +1 ) ).substr(-2);
          data['jahr']    = d.getFullYear();
          data['ltm']     = (new Date( d.getFullYear(), d.getMonth()+1, 0 )).getDate();
      
          return data;
      
      }
      
      //Einheiten auslesen
      function getUnits( u ){
      
          var unit = new Object();
          if( u == 0 ){
      
              unit['api'] = "Metrics",
              unit['unit'] = "Kg"
      
          } else if ( u == 1 ){
      
              unit['api'] = "Imperial",
              unit['unit'] = "Lb"
      
          };
      
          return unit;
      
      }
      
      function getActivePlants(){
      
          let anlagen = new Array;
          let cache = $('channel[state.id='+ pfad +'Anlagen.*.Status]');
      
          cache.each(function(obj){
              if( existsState( obj ) && getState( obj ).val == 'Active' ){
                  var id = obj.split(".");
                  anlagen.push( id[ (id.length-2) ] );
              }
          });
      
          return anlagen;
      
      };
      
      // Tägliche Jobs
      schedule('0 0 * * *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze tägliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Gestern', getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val, true );  
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', 0, true );
      
              //Anlagendaten einlesen
              systemdaten();
          
          });
      
      });
      
      // Monatliche Jobs
      schedule('0 0 1 * *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze monatliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', 0, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', 0, true );
          
          });
      
      });
      
      // Jährliche Jobs
      schedule('0 0 1 1 *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze jährliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', 0, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', 0, true );
          
          });
      
      });
      
      //Datenpunkte prüfen
      function checkStates( state ){
      
          if( existsState( state ) === false ){
      
              log('Initialeinreichtung wird durchgeführt. Bitte den API Key in der Konfiguration eingeben.', 'warn');
              createStates( pfad );
              return false;
      
          } else return true;
      
      };
      
      // Anlagen einlesen wenn erzwungen
      schedule('* * * * *', function(){
          if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) systemdaten();
      });
      
      //Datenpunkte erstellen
      function createStates( pfad ){
      
          let einheiten = ['Metrisch', 'Imperial'];
      
          createState( pfad +'Konfiguration.APIKey', 0, {read: true, write: true, type: 'string', desc: 'Solaredge API Schlüssel'});
          createState( pfad +'Konfiguration.AnlagenEinlesen', true, {read: true, write: true, type: 'boolean', desc: 'Anlagen neu einlesen'});
          createState( pfad +'Konfiguration.Einheit', 0, {read: true, write: true, type: 'number', desc: 'Metrische oder Imperiale Einheiten', states: einheiten});
          
      }
      
      posted in JavaScript
      T
      TobStar
    • RE: Daten per MQTT an OpenSenseMap senden

      @homoran auf deren Seite ist nur ein Client vorhanden an den dann die Daten gesendet werden. Das geht wie ich nun rausbekommen habe per sendTo()

      Die Daten werden dann als JSON Objekt erwartet.

      https://docs.sensebox.de/opensensemap/opensensemap-mqtt/

      posted in ioBroker Allgemein
      T
      TobStar
    • Daten per MQTT an OpenSenseMap senden

      Hallo zusammen,

      ich möchte gerne meine Sensordaten an OpenSenseMap senden. Diese können die Daten auch per MQTT empfangen, dazu habe ich mir den MQTT Server / Broker Adapter installiert ... und da verließen Sie Ihn dann.

      Ich habe noch keine Berührungspunkte mit MQTT gehabt und frage mich gerade wie ich nun per Javascript / MQTT eine Verbindung zu einem Client herstelle und diesem Daten senden kann. Grundsätzlich habe ich mal eine Verbindung vom Android zum MQTT Server (iobroker) herstellen können, doch wie sende ich da jetzt Daten hin?

      Vielleicht hat das ja schon jemand gemacht und kann hier einen Auszug zeigen.

      Danke dafür.

      posted in ioBroker Allgemein
      T
      TobStar
    • [Vorlage] Bewässerung mit Gardena 6-Fach Verteiler

      Hallo zusammen,

      ich habe mich nochmal an mein Bewässerungs-Script zur Steuerung des Gardena 6-Fach Verteilers gemacht und es so gestaltet das es einfach zu bedienen ist.

      Die aktuellste Version des Scripts findet Ihr auf GitHub unter https://github.com/GodHunter/iobroker-sprinkling-gardena dort sind auch alle Informationen zur Einrichtung beschrieben.

      Das Script selbst besteht aus 2 Teilen, das eine ist für die Automatik zuständig und berücksichtig dabei den Niederschlag für den aktuellen Tag und das andere ist für die eigentliche Schaltung zuständig.

      Beregnung_starten.js

      const pfad   = "0_userdata.0.Beregnung.Garten.";
      const device = "sonoff.0.Sonoff-Garten.POWER";
      const alive  = getState( 'sonoff.0.Sonoff-Garten.alive' ).val; 
      
      const debug  = true;
      
      schedule("* 4-22 * * *", main);
      
      function main(){
      
          if( debug )  log('-== STARTE BEWÄSSERUNGS-ROUTINE ==-');
          if( !alive ) log(device +' ist nicht erreichbar', 'error');
      
          //Objekte anlegen
          if(!existsState( pfad +'Allgemein.Aktiv' )) {
              createStates( pfad );
              return true;
          };
      
          const positionen = []; //Objekt hält wartende Positionen
          let total = 0; //Anzahl aller aktiven Positionen
      
          var selector = $('state[state.id=0_userdata.0.Beregnung.Garten.*._Aktiv]');    
          selector.each(function (obj, index) {
              
              //Alle aktiven Verteilerpositionen einlesen
              if( getState( obj ).val === true ){
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  total++;
      
                  //Alle wartenden Objekte einlesen
                  if( getState( objekt[0] +'._Warte' ).val === true ) positionen.push( Number( objekt[0].slice(-1) ) );
      
              }
          
          });
      
          //Wenn Beregnung ausstehend und keine aktive Beregnung
          if( positionen.length !== 0 && getState( pfad +'Allgemein.Aktiv' ).val === false && alive ) {
              
              if( debug ) log( total +' Positionen sind eingetragen.' );
      
              let vtposition = Number( getState( pfad +'Verteiler.Allgemein.Position' ).val +1 );
              if( vtposition > total ) vtposition = 1;      
          
              if( positionen.includes( vtposition ) === false ){ //Umschalten wenn Kanal nicht wartend
                  
                  if(debug) log( 'Verteiler wird umgeschalten ( Bereich '+ vtposition +' )' );
      
                  einschalten(  vtposition );
                  setTimeout(
                      function() {
                          ausschalten();
                      }
                  , 20000);
      
              } else { //Beregnung starten
      
                  var dauer = Number( getState( pfad +'Verteiler.'+ vtposition +'.Dauer' ).val );
                  if( debug ) log( 'Beregnung wird gestartet ( Bereich '+ Number( vtposition ) +' / '+ dauer +' Minuten )' );
      
                  setState( pfad +'Allgemein.Aktiv', true, true );
                  setState( pfad +'Allgemein.Restlaufzeit', dauer, true );
                  setState( pfad +'Verteiler.'+ vtposition +'._Warte', false, true );
      
                  //Nächste Beregnung zurücksetzen
                  if( Number( getState( pfad +'Verteiler.'+ vtposition +'.NaechsteBeregnung' ).val ) === 0 ) setState( pfad +'Verteiler.'+ vtposition +'.NaechsteBeregnung', Number( getState( pfad +'Verteiler.'+ vtposition +'.Intervall' ).val ) );
      
                  einschalten(  vtposition );
      
              }
      
          } else if( getState( pfad +'Allgemein.Aktiv' ).val === true ){ //Anhaltende Beregnung
      
              var laufzeit = Number( getState( pfad +'Allgemein.Restlaufzeit' ).val );
              
              if( Number( laufzeit-1 ) > 0 ) {
               
                  if( debug ) log( 'Aktive Beregnung ( Bereich '+ getState( pfad +'Verteiler.Allgemein.Position' ).val +' / '+ Number( laufzeit-1 ) +' Minuten ).' );
                  setState( pfad +'Allgemein.Restlaufzeit', Number( laufzeit-1 ), true );
      
              } else if( alive ) {
      
                  if( debug ) log( 'Beregnung wird beendet ( Bereich '+ getState( pfad +'Verteiler.Allgemein.Position' ).val +' )' );
                  setState( pfad +'Allgemein.Aktiv', false, true );
                  setState( pfad +'Allgemein.Restlaufzeit', Number( 0 ), true );
                  ausschalten();
      
              } else log( 'Die Beregnung konnte nicht beendet werden.', 'error');
      
          } else if( debug ) log('Keine geplante Beregnung.');
      
          if(debug) log('-== BEENDE BEWÄSSERUNGS-ROUTINE ==-');
      
      }
      
      function einschalten( x ){
          setState( pfad +'Verteiler.Allgemein.Position', Number( x ), true );
          setState( device, true );
      }
      
      function ausschalten(){
          setState( device, false );
      }
      
      function createStates(pfad){
          
          createState(pfad +'Allgemein.Automatik', false, {read: true, write: true, type: 'boolean', desc: 'Automatikmodus An / Aus'});
          createState(pfad +'Allgemein.Aktiv', false, {read: true, write: true, type: 'boolean', desc: 'Aktive Beregnung'});
          createState(pfad +'Allgemein.Restlaufzeit', 0, {read: true, write: true, type: 'number', unit: 'Minuten', desc: 'Warten auf laufende Bewässerung'});
          createState(pfad +'Verteiler.Allgemein.Position', 1, {read: true, write: true, type: 'number', desc: 'Aktuelle Position des Verteilers'});
          createState(pfad +'Verteiler.Allgemein.Gesamt', 4, {read: true, write: true, type: 'number', desc: 'Anzahl der angeschlossenen Ventile'});
      
          for (let i = 1; i <= 6; i++) {
              createState(pfad +'Verteiler.'+ i +'._Aktiv', false, {read: true, write: true, type: 'boolean', desc: 'Bereich angeschlossen'});
              createState(pfad +'Verteiler.'+ i +'.Dauer', 5, {read: true, write: true, type: 'number', unit: 'Minuten', desc: 'Dauer der Bewässerung'});
              createState(pfad +'Verteiler.'+ i +'._Warte', false, {read: true, write: true, type: 'boolean', desc: 'Wartet auf Bewässerung'});
              createState(pfad +'Verteiler.'+ i +'.Bezeichnung', 'Position '+ i, {read: true, write: true, type: 'number', desc: 'Nummer des Ventils'});
              createState(pfad +'Verteiler.'+ i +'.Intervall', 4, {read: true, write: true, type: 'number', unit: 'Tage', desc: 'Gewünschter Beregnungsintervall in Tagen'});
              createState(pfad +'Verteiler.'+ i +'.NaechsteBeregnung', 4, {read: true, write: true, type: 'number', unit: 'Tage',  desc: 'Verbleibende Tage bis zur Beregnung'});
          };
      
      }
      

      Beregnung_planen.js

      const pfad  = "0_userdata.0.Beregnung.Garten.";
      const debug = true;
      
      const niederschlagsmenge = Number( 2 );
      const niederschlag = "0_userdata.0.Systemdaten.Wetter.d0.Niederschlagsmengein24h";
      
      schedule("30 2 * * *", main);
      
      function main(){
      
          if( debug ) log('-== STARTE BEWÄSSERUNGS-PLANUNG ==-');
      
          if( getState( pfad +'Allgemein.Automatik' ).val === true ){
      
              var selector = $('state[state.id='+ pfad +'Verteiler.*.NaechsteBeregnung]');    
              selector.each(function (obj, index) {
                  
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  var position = Number( objekt[0].slice(-1) );
                  var aktiv = getState( objekt[0] +'._Aktiv' ).val;
                  
                  
                  //Bei Regen zurücksetzen
                  if( Number( getState( niederschlag ).val ) >= niederschlagsmenge && aktiv ){
      
                      if( debug ) log('Setze Bereich '+ position +' wegen Regen zurück.');
                      setState( obj, Number( getState( objekt[0] +'.Intervall' ).val ), true );
      
                  } else if( aktiv ) {
      
                      //Beregnung bei erreichen des Intervalles einplanen
                      if( Number( getState(obj ).val -1 ) === 0 ){
                          
                          if( debug ) log('Plane Beregnung für den Bereich '+ position +' ein.'); 
                          setState( obj, Number( getState( obj ).val -1 ), true );
                          setState( objekt[0] +'._Warte', true, true);
                      
                      } else { //Nächste Beregnung runterzählen
      
                          if( debug ) log('Beregnung für den Bereich '+ position +' startet in '+ Number( getState( obj ).val -1 ) +' Tagen.');
                          setState( obj, Number( getState( obj ).val -1 ), true );
      
                      }
      
                  }
      
              })
      
          }
      
          if( debug ) log('-== ENDE BEWÄSSERUNGS-PLANUNG ==-');
      
      }
      
      //Beregnung zurücksetzen bei Automatik aus
      $( 'state[state.id='+ pfad +'Allgemein.Automatik]' ).on( function (obj) {
      
          if( getState( obj.id ).val === false ){
      
              var selector    = $( 'state[state.id='+ pfad +'Verteiler.*.NaechsteBeregnung]' );
      
              selector.each(function (obj, i) {
                  
                  var objekt = obj.split(/\.(?=[^\.]+$)/);
                  setState( obj, getState( objekt[0] +'.Intervall' ).val, true );
                  setState( objekt[0] +'._Warte', false, true );
      
              });
      
          }
          
      });
      
      //Bei Veränderung des Intervalls
      $('state[state.id='+ pfad +'Verteiler.*.Intervall]').on( function (obj) {
      
          var objekt = obj.id.split(/\.(?=[^\.]+$)/);
          if( getState( obj.id ).val < getState( objekt[0] +'.NaechsteBeregnung' ).val) setState( objekt[0] +'.NaechsteBeregnung', getState( obj.id ).val, true );
      
      });
      
      posted in JavaScript
      T
      TobStar
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo