Navigation

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

    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

    S
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 24
    • Best 2
    • Groups 1

    steinche

    @steinche

    Starter

    2
    Reputation
    13
    Profile views
    24
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    steinche Follow
    Starter

    Best posts made by steinche

    • RE: gelöst - Iobroker Cloud

      Hallo in die Runde,

      das Thema ist zwar schon ein paar Tage älter, aber scheinbar kommt der Cloud Adapter immer noch nicht damit klar, wenn die web bzw Admin Instanz mit Authentifizierung arbeitet.
      Die Bedenken von @Wieger-Daniel kann ich nachvollziehen, denn jeder Netzwerkteilnehmer oder interessierte Kids in eigenen Netzwerk haben so quasi Zugriff auf den ioBroker.
      Gibt es inzwischen eine Lösung, wo die Zugriffssicherheit auf ioBroker soweit möglich gewährleistet ist und man trotzdem den Cloud Adapter für den externen Zugriff verwenden kann?

      Viele Grüße und einen schönen Abend!
      Eric

      posted in ioBroker Allgemein
      S
      steinche
    • RE: [solved] AMCE Adapter Einrichtung über DNS-01 Challenge

      Hallo nochmal,

      die Lösung schaut wie folgt aus:

      Über die API Seite bei Cloudflare https://dash.cloudflare.com/profile/api-tokens einen neue Token erstellen. Wenn Cloudflare in deutscher Sprache eingestellt ist, folgende Einstellungen verwenden:

      1.) Über das Stiftsymbol dem Token einen Namen geben. Z.b. "ioBroker-ACME"
      2.) Button "Token erstellen"
      3.) Die Vorlage "Zonen-DNS bearbeiten" verwenden
      4.) Bei der Berechtigung muss der Eintrag "Zone / DNS / bearbeiten" lauten
      5.) Die Zonenressourcen auf " Einschließen / Alle Zonen"
      6.) Weiter zur Zusammenfassung
      7.) Token erstellen
      8.) Token kopieren und im ACME Adapter einfügen

      That's it.

      posted in ioBroker Allgemein
      S
      steinche

    Latest posts made by steinche

    • RE: [solved] AMCE Adapter Einrichtung über DNS-01 Challenge

      Hallo nochmal,

      die Lösung schaut wie folgt aus:

      Über die API Seite bei Cloudflare https://dash.cloudflare.com/profile/api-tokens einen neue Token erstellen. Wenn Cloudflare in deutscher Sprache eingestellt ist, folgende Einstellungen verwenden:

      1.) Über das Stiftsymbol dem Token einen Namen geben. Z.b. "ioBroker-ACME"
      2.) Button "Token erstellen"
      3.) Die Vorlage "Zonen-DNS bearbeiten" verwenden
      4.) Bei der Berechtigung muss der Eintrag "Zone / DNS / bearbeiten" lauten
      5.) Die Zonenressourcen auf " Einschließen / Alle Zonen"
      6.) Weiter zur Zusammenfassung
      7.) Token erstellen
      8.) Token kopieren und im ACME Adapter einfügen

      That's it.

      posted in ioBroker Allgemein
      S
      steinche
    • [solved] AMCE Adapter Einrichtung über DNS-01 Challenge

      Hallo in die Runde,

      bei mir klemmt es ganz am Anfang mit der Einrichtung des ACME Adapter.
      Folgende Rahmenbedingungen gibt es:
      Eine eigene Domain ist vorhanden (z.B. ganzegal.de) Bei Cloudflare ist für den ioBroker ein DS Eintrag vom Typ A eingerichtet und die lokale IP hinterlegt. Also "iob.ganzegal.de" verweist auf die 192.178.x.y
      Wenn ich jetzt diese Adresse aufrufe, komme ich auch zum ioBroker. Wo es jetzt klemmt ist passende Token. Im Bereich der Website gibt es bei den API Informationen ein Zonen-ID und Konto-ID. Ebenso kann im Profil ein API Token erstellt werden.
      Im ACME Adapter sind folgende Einstellungen:
      Allgemein: Die Mailadresse, die auch bei Cloudflare hinterlegt ist.
      Challenges: DNS-01 Herausforderung verwenden, als DNS-01 Challenge Modul 'ClodFlare' und bei DNS-01 Token habe ich alle drei oben genannten Token versucht. Der Haken bei DNS-01 Ausbreitung überprüfen ist ebenfalls gesetzt
      Sammlungen:
      ID: 1
      Domäne: iob.ganzegal.de
      Alternative Namen: *.iob.ganzegal.de

      Im Log fängt es an mit:

      Collection 1 does not exist - will create
      

      und dann kommt:

      Certificate request for 1 (iob.ganzegal.de,*.iob.ganzegal.de) failed: HTTPError: Response code 400 (Bad Request)
      

      Weiß jemand, wo bin ich falsch abgebogen bin?
      Mit der Anleitung des Adapters unter https://github.com/iobroker-community-adapters/ioBroker.acme?tab=readme-ov-file#acme-adapter-for-iobroker komme ich auch nicht weiter.

      Viele Grüße und schon mal Danke für's lesen 🙂

      posted in ioBroker Allgemein
      S
      steinche
    • RE: Datenpunkte für Livisi Geräte einbinden, wie?

      Hallo in die Runde,

      ich klinke mich hier mal ein, da ich auch mit einem Datenpunkt und Alexa nicht weiter komme.
      Der Datenpunkt: 0_userdata.0.Ladeinfo.EndZeit ist in der Instanz des IOT Adapters unter Alexa-Geräte eingetragen. Alexa hat das "Geräte" auch gefunden 😊 allerdings schaffe ich es nicht, in den Datenpunkt eine Uhrzeit einzutragen.
      Der Befehl: "Alexa, schalte Endzeit ein" setzt den Wert auf True, genauso mit "Aus" auf False. Aber wenn ich eine Uhrzeit oder Zahl oder Text oder sonst was eintragen lassen möchte, kommt die Meldung von Alexa "Endzeit unterstützt das nicht.".
      Bei Zustandstyp des Datenpunkts habe ich schon alles möglich versucht, ebenso bei Rolle schon timer, text, etc. durchprobiert, leider erfolglos 😞

      Hat da wer eine Idee, was hier eingestellt werden muss?

      Viele Grüße und einen schönen Abend!

      posted in ioBroker Allgemein
      S
      steinche
    • RE: Richtige Hardware für WLED Projekt

      Hallo in die Runde

      Auch wenn das Thema schon etwas älter ist, wollte ich doch noch einmal ansetzen.

      Ich plane eine etwas größere LED Matrix, diese besteht aus 40 x 150 LEDs. Von den 40 Streifen kommen immer 5 Stück in Reihe. Diese 750 LEDs werden alle 150 LEDs von dem gleichen Netzteil (12A) eingespeist. Diese Anordnung habe ich 8 mal, die Masse aller Netzteile ist verbunden.
      Die Ansteuerung mache ich über zwei ESP32. Jeder ESP32 steuert 4 Blöcke über einen eigenen GPIO.
      Jetzt stellt sich mir die Frage, was konfiguriere ich in den WLED LED Einstellungen bei maximalem Strom. Die 4 Netzteile für die LED-Blöcke des ersten ESP32 liefern in Summe 48A.
      Wenn ich das in WLED konfiguriere kann WLED die 4 einzelnen Kreise ja nicht "schützen", oder? Würde jede LED des ersten Blocks zu 100% angesteuert werden, reichen dazu die 12A des Netzteils nicht aus.
      Wie würdet ihr das lösen? Davon mal angesehen, wird es in der Praxis vermutlich nicht dazu kommen, aber rein interessehalber.

      Hoffe ich habe mich verständlich ausgedrückt 😄

      posted in Hardware
      S
      steinche
    • RE: Grafana Dashboard in VIS einbinden

      Update: Habe die Lösung gefunden!

      Es lag bei mir an den Organisationseinstellungen in Grafana.
      e542e134-34ab-4f42-97c9-8de9514bc5ca-image.png

      Habe den Namen in der grafana.ini eingetragen

      [auth.anonymous]
      org_name = Muster
      

      ... und schon hat es funktioniert 😁

      Manchmal kann es so einfach sein.

      Wünsche allen noch eine gute Nacht.

      posted in Grafana
      S
      steinche
    • RE: Grafana Dashboard in VIS einbinden

      Guten Abend in die tolle Runde,

      Grafana ärgert mich seit Stunden. Beim einbinden in die VIS frägt werde ich immer zur Eingabe von Benutzername und Kennwort aufgefordert, obwohl in der grafana.ini folgende Punkte eingestellt sind:

      [security]
      allow_embedding = true
       
      [auth.anonymous]
      enabled = true 
      org_name = Main Org.
      org_role = Viewer
       
      [users]
      allow_sign_up = false
      

      Im Editor sieht es so aus:
      d866228e-f8aa-48f0-97f8-f9b2bb4e6cf5-image.png

      Wenn ich die Anmeldedaten eingebe, erscheint das Login Fenster erneut. Beim Aufruf des einzufügenden Links im Browser, kommt ebenfalls das Anmeldefenster.

      In der VIS habe ich es mit dem iFrame Wigdet und HTML Widget versucht. Bei dem HTML Widget habe ich den iframe Link von Grafana eingebunden.

      und in den Einstellungen von Grafana scheint es auch zu stimmen:
      73c3f059-35db-455e-bcb2-56da0fe1c361-image.png

      Grafana läuft zusammen mit der InfluxDB in einem Proxmox LXC Container. Habe auch schon den Container von Grafana und auch iobroker neu gestartet. Leider alles ohne Erfolg 😢

      Wo kann ich ansetzen, um dem Problem auf die Schliche zu kommen.

      Einen schönen Abend

      Eric

      posted in Grafana
      S
      steinche
    • RE: [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen

      @oliverio said in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      @steinche sagte in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      Das muss doch daran liegen, dass dem request etwas nicht passt?

      @oliverio sagte in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      Mit der oben besagten Version 12.15 wurde eingeführt, das der response header einer http anfrage strikter geprüft wird. wenn nun der server ein nicht erlaubtes zeichen sendet, dann wird dieser fehler geworfen.

      Sorry, ich bin von Hause aus SPS Programmierer und dementsprechend eher in anderen Sprachen unterwegs.

      Hast du den Artikel gelesen, den ich oben verlinkt habe?

      Den Artikel habe ich gelesen, bin aber davon ausgegangen, dass es sich auf axios bezieht.

      Das setzen der Option unterdrückt diese strikte Prüfung.

      Das habe ich festgestellt 😉

      wenn man unbedingt das auch für request lösen will muss man im Internet suchen.
      allerdings ist axios neuer und request ist deprecated. also reicht die eine funktionierende Lösung ja aus.

      dein aktueller code:
      jetzt hast du axios wieder zu request zurückgebaut?

      Nein, das war nur eine Frage, weil im ursprünglichen Code von @wberger mit request gearbeitet wurde.

      verstehst du den unterschied zwischen request und axios überhaupt?

      Nein, ich kann erkennen, dass die beiden Funktionen(?) Daten holen sollen, damit hört es bei mir schon auf.

      wer hat den jetzt das folgende geschrieben? Ich blick da nicht mehr durch

      @steinche sagte in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      Habe es auf axios umgebaut und um ', { insecureHTTPParser: true }' ergänzt -> ERFOLGREICH!!

      Den Abruf mittels axios hat @ticaki hier geschrieben und ich habe bei mir eingesetzt. Danach haben wir viel hin und her probiert, auch mit curl und mein obiger Kommentar bezog sich auf den Code von @ticaki , den ich um den Parameter aus Deinem Link ergänzt habe. Da habe ich dann selbst hinbekommen. Aber das ist so das Level, auf dem ich mich bewege - also Grundschule addieren im Zahlenbereich 1-10 😉

      Den Bereich, der die Daten parst konnte ich auch entsprechend der noch für mich wichtigen Daten erweitern. Allerdings ging es bei mir dann über den Zahlenbereich von 10 hinaus, da im Log von ioBroker beim schreiben der Werte bei jedem Wert eine Warnung kommt.

      2023-08-05 07:38:02.034	warn	Read-only state "javascript.0.meteohub.alltime.sol0.radiation" has been written without ack-flag with value "153.9"
      

      Ich versuche immer erst mal selbst zu schauen und nicht, dass man mir den Arm bei jeder Kleinigkeit aus der Sonne legen muss. Die Suche hat folgendes gefunden Klick
      Daraufhin die Eingträge

      else { setState(id,parseFloat(item[j].$t)) }
      

      gegen:

      else { setState(id,parseFloat(item[j].$t), true) }
      

      ersetzt. "Problem" selbst gelöst und autodidaktisch den Zahlenbereich bis 20 erschlossen 🙂
      Ich werde den aktuellen Code noch etwas um Kommentare ergänzen, auch den Teil, der die Daten parst um ein paar Standardwerte und in dann hier rein stellen, falls noch jemand Meteohub verwendet direkt, ohne Umweg über Wetterdiente, auch seine Daten zugreifen möchte.

      Und man kann es nicht oft genug sagen DANKE !!!

      posted in Skripten / Logik
      S
      steinche
    • RE: [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen

      @oliverio said in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      und er hat seinen code versteckt. so geht man von falschen voraussetzungen aus und verschendet ungern zeit. das ist bspw bei mir so ein lust-killer

      Ich hatte die Teile "eingebaut", die @ticaki so versucht hat, daher hatte ich nicht jedes mal den komplette Code gepostet.

      Die original Funktion:

      function getXML(do_init) {
          // loads full meteohub xml file from the mh_URL and calls the parse function.
          // on very first execution do_init is true and all states are created. Each successive call only sets the state values.
          log('meteohub query data from '+mh_URL); // Debug output
          request(mh_URL, function (error, response, body) {
              if (error) log("Fehler beim Herunterladen Meteohub XML: " + error, 'error');
              else {
                  //var start = new Date();
                  parseXML(body,do_init);
                  //var time = new Date() - start;            
                  //log('Meteohub XML2JS Durchlaufzeit: '+time); 
              };
          });
      }
      

      bringt den Fehler:

      23:47:04.347	error	javascript.0 (77182) script.js.common.WetterdatenEinlesen: Fehler beim Herunterladen Meteohub XML: Error: Parse Error: Invalid header value char
      

      Das muss doch daran liegen, dass dem request etwas nicht passt?

      Abschließend noch mal vielen Dank an alle für die Unterstützung, dass die Daten jetzt abgerufen werden!

      Die Verarbeitung der Daten muss ich noch anpassen, aber das bekomme ich hoffentlich alleine hin. Inzwischen weiß ich etwas mehr zu JavaScript als nur, wie man es schreibt 😊

      posted in Skripten / Logik
      S
      steinche
    • RE: [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen

      @oliverio said in [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen:

      @steinche

      da ist der code mit axios abruf nicht mehr drin.

      @ticaki hat ziemlich viel versucht.

      lese den link oben durch, dann kennst du den grund, warum der fehler geworfen wurde.
      Habe es auf axios umgebaut und um ', { insecureHTTPParser: true }' ergänzt -> ERFOLGREICH!!

      funktioniert den der curl aufruf aus dem skript heraus?
      da könnten evtl noch berechtigungsprobleme anstehen.
      der nutzer iobroker muss curl benutzen dürfen
      skripte werden immer als benutzer iobroker auf dem system durchgeführt

      Berechtigungen für alle auf ausführen gesetzt, ohne Erfolg.

      posted in Skripten / Logik
      S
      steinche
    • RE: [gelöst] Meteohub Daten, XML parsen, JSON durchsuchen

      @oliverio

      Bei mir läuft die node Version 18.17.0

      Der aktuelle Code sieht so aus:

      /* Meteohub
      Skript holt Daten aus Meteohub XML Datei, bereitet sie auf und stellt einige Datenpunkte zur Verfügung
      erstellt: 2020 Wolfgang Berger
      {1}
      V 0.1 Initiale Version. Hartcodierte Zuordnung. Wird nicht funktionieren sobald der Windmesser online ist.
      V 0.2 jetzt Sensoren in Liste
      V 0.3 kosmetische Aufbereitung. Altlasten entfernt.
      */
       
      // Settings   ################################################################
      const mh_URL = 'http://192.168.75.9/meteograph.cgi?text=allxml';
      const axios = require('axios') // das an den Anfang des Skripts
      
      // End of settings ###########################################################
       
       
      // Includes    ################################################################
      const request = require('request');    
      var parser = require('xml2json');
      const util = require('util');      // for debugging. Use log(util.inspect(obj));
       
      // Type definitions  ################################################################
      var state_temp = {      type: 'number',  unit: '°C',   read: true,  write: false,role: 'value.temperature' };
      var state_json = {                                     read: true,  write: false,role: 'mh.json' };    
      var state_humidity = {  type: 'number',  unit: '%rH',  read: true,  write: false,role: 'value.humidity' };                                  
      var state_speed = {     type: 'number',  unit: 'km/h', read: true,  write: false,role: 'value.speed' };                                  
      var state_direction = { type: 'number',  unit: '°',    read: true,  write: false,role: 'value.direction' };                                  
      var state_pressure  = { type: 'number',  unit: 'mbar', read: true,  write: false,role: 'value.pressure' };     
      var state_rainrate  = { type: 'number',  unit: 'mm/h', read: true,  write: false,role: 'value.precipitation.hour' };         
      var state_rain  = {     type: 'number',  unit: 'mm',   read: true,  write: false,role: 'value.precipitation.today' };             
       
      // Now build State Tree ################################################################
      function parseXML(xmldata,do_init) {
         log(xmldata)
         var mh_json = parser.toJson(xmldata);    // convert XML to JSON
         var mh_data = JSON.parse(mh_json);       // parse JSON into JS object
         let data = mh_data.meteohub.data;        // only use the data section of the object. We ignore the config section for now.
       
         // Loop through data sections. each data[i] contains data for a given timeframe like actual, like 1h, 1day, etc.
         for(let i = 0; i < data.length; i++) {
           let folder = 'meteohub.' + data[i].timeframe + '.';       // timeframe is can be "actual", "alltime" and much more. Each datasection only contains one timeframe value
           let item = data[i].item;
           //   log(util.inspect(data[i]));
       
           // Now we have selected one timeframe and loop through all items
           // instead of building a state tree with hundreds of values, we pick only the ones that are interesting.
           for(let j = 0; j < item.length; j++) {
              let id = folder + item[j].sensor + '.' + item[j].cat;
       
              // Temperature Value in degrees Celsius
              if( (item[j].cat == 'temp') && (item[j].unit == 'c')) {
                  if (do_init==true) {    createState(id,parseFloat(item[j].$t),state_temp); }
                    else {    setState(id,parseFloat(item[j].$t)); }
              }
       
              // Humidity as relative humidity
              if( (item[j].cat == 'hum') && (item[j].unit == 'rel')) {
                  if (do_init==true) {   createState(id,parseFloat(item[j].$t),state_humidity); }
                    else  {   setState(id,parseFloat(item[j].$t)); }          
              }
       
              // Air pressure refered to sealevel
              if( (item[j].cat == 'sealevel') && (item[j].unit == 'hpa')) {   
                  if (do_init==true) {   createState(id,parseFloat(item[j].$t),state_pressure); }
                    else  {   setState(id,parseFloat(item[j].$t)); }          
              }        
       
              // rain values in mm
              if( (item[j].sensor == 'rain0') && (item[j].unit == 'mm')) {
                  if (do_init==true) { createState(id,parseFloat(item[j].$t),state_rain);  }
                    else { setState(id,parseFloat(item[j].$t));  }
              }
       
              // for windsensor currently we tend to catch nearly all, because the whitelist could be long. For example windspeed is interesting in different units.
              // Therefore instead of whitelisting the values we do the oposit and use a blacklist for the ones we don't like.
              if( (item[j].sensor == 'wind0') ) {
                  if ((item[j].unit == 'time')) {
                      let dat = item[j].$t;
                      let d = new Date(dat.substring(0,4) + '-' + dat.substring(4,6) + '-' + dat.substring(6,8) + 'T' + dat.substring(8,10) +':' + dat.substring(10,12) + ':'+ dat.substring(12,14) );
                      if (do_init==true) {    createState(id+'.'+item[j].unit,  d);    }
                        else {    setState(id+'.'+item[j].unit,  d);    }
                  }
                  else {
                      // first catch values in degrees celsius. Because there we can set the unit. Leave the others without unit.
                      if (item[j].unit == 'c') {
                        if (do_init==true) { createState(id+'.'+item[j].unit,  parseFloat(item[j].$t),state_temp); }                           
                          else  { setState(id+'.'+item[j].unit,  parseFloat(item[j].$t)); }               
                      }
                      else {
                          // Blacklisting for values we don't like
                          if (!(item[j].unit == 'f' || item[j].unit == 'en' || item[j].unit == 'nl' || item[j].unit == 'mph')) {
                          if (do_init==true) { createState(id+'.'+item[j].unit,  parseFloat(item[j].$t)); }                           
                              else  { setState(id+'.'+item[j].unit,  parseFloat(item[j].$t)); }               
                          }
                      }
                  }
              }
       
           }
          }
       
      }  // end parseXML()
       
      async function getXML(do_init) {
          // loads full meteohub xml file from the mh_URL and calls the parse function.
          // on very first execution do_init is true and all states are created. Each successive call only sets the state values.
          
          log('meteohub query data from '+mh_URL); // Debug output
          let result = null
          try {
              result = await execAsync('curl '+mh_URL) 
              log(result) // kann weg wenns geht, ansonsten das hier posten
          } catch(e) {log(e)}
          if (result) {
              var start = new Date();            
              parseXML(result, do_init);
              var time = new Date() - start;            
              log('Meteohub XML2JSON Durchlaufzeit: '+time);             
          } else {
              log('Keine Daten','warn')
          };  
      }
      
      
      // On first script execution, create the states
       let do_init=true;
       getXML(do_init);
      
      function execAsync(f) {
          return new Promise((resolve, reject) => {
              exec(f, function (error, stdout, stderr) {
                  resolve();
              });
          })
      }
      
      // Regular Update
      schedule('*/1 * * * *', function () {
          let do_init=false;
          getXML(do_init);  // regelmäßiger Update
      });
      

      Ursprünglich war es der Code aus dem Post und die Zeile für den Datenabruf:

      const mh_URL = 'http://192.168.75.9/meteograph.cgi?text=allxml';
      

      musste angepasst werden. Danach hatte ich das Problem, dass er wegen folgenden Fehler hatte:

      20.7.2023, 21:05:08.838	[error]: javascript.0 (2129892) script.js.common.WetterdatenEinlesen: Fehler beim Herunterladen Meteohub XML: Error: Parse Error: Invalid header value char
      

      @Homoran , @paul53 und @ticaki haben sich dann an vielen Dingen versucht, aber bisher ohne Erfolg 😢

      posted in Skripten / Logik
      S
      steinche
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo