Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    M
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 14
    • Best 0
    • Groups 1

    Magda

    @Magda

    0
    Reputation
    29
    Profile views
    14
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Magda Follow
    Starter

    Latest posts made by Magda

    • RE: Flexibler Heimspeicher

      @haus-automatisierung Danke für deine Antwort. Zendure hab ich mir tatsächlich schon angeschaut und war darüber verschreckt, dass MQTT nur über (eine unzuverlässige) Cloud möglich ist.

      Es gibt zwar eine Anleitung, das Teil zu "rooten", aber dann ist ja wieder die Haftungsfrage offen :).

      posted in Off Topic
      M
      Magda
    • Flexibler Heimspeicher

      Hallo in die Runde.

      Ich bin auf der Suche nach einem Heimspeicher, den ich ohne Elektriker installieren kann. Knackpunkt dabei ist, dass ich das Laden und Entladen lokal über ioBroker steuern möchte.

      Bisher habe ich nur die Variante mit Ecoflow und 2 steuerbaren Steckdosen gefunden. Das ist mir aber zu binär (laden ja/nein, entladen ja/nein). Das hätte ich gern variabler um bspw. PV Überschuss zum Laden zu nutzen. Da aber auch das Auto überschussgeladen werden soll, will ich hier in der Priorisierung eingreifen können.

      Der Marstek Venus schaut so aus, als ob er das dynamische Laden/Entladen beherrscht, allerdings nur extern gesteuert.

      Achso, ich will ein Consumer Gerät, nichts selbst zusammengebautes, da das ganze im Keller stehen soll und ich jemanden verklagen will, wenn alles in die Luft fliegt. Und mehr als 500€/kWh sollte es auch nicht kosten.

      Vielleicht hat ja jemand noch eine Idee oder kennt ein entsprechendes Produkt.

      posted in Off Topic
      M
      Magda
    • RE: SMA Wechselrichter

      Da ich jetzt auch solaren Strom erzeuge, wollte ich auch die Werte aus meinem Sunny Tripower 8.0 auslesen und weiterverwursten. Modbus ist aber abgeklemmt, daher hab ich nach Alternativen gesucht und eine gefunden. Ich konnte in dem Thread hier nichts zu der lokalen REST-API finden, falls ich das nur übersehen hab, ignoriert meinen Post bitte. Ich konnte auch nirgends was offizielles zu der API finden, war also ein wenig Trial'n'Error.

      Bisher hab ich den Aufruf nur als Javascript implementiert, vielleicht will ja jemand einen Adapter basteln. Hier grob der Ablauf:

      Über https://[ip vom sma]/dyn/login.json kann man sich per POST mit dem JSON { "pass": "[Passwort]", "right": "usr" } eine SID geben lassen.

      Damit kann man dann über https://[ip vom sma]/dyn/getValues.json?sid=[erhaltene SID] bestimmte Schlüssel abfragen. Diese muss man per POST als JSON übergeben. Bei meinem Wechselrichter sieht das JSON dann so aus: { "destDev": [], "keys": ["6400_00260100", "6400_00262200", "6100_40263F00"] }

      Als Antwort erhält man die Schlüssel mit ihren Werten zurück.
      6400_00260100 = Ertrag gesamt in W
      6400_00262200 = Ertrag heute in W
      6100_40263F00 = aktuelle Leistung

      Es gibt noch mehr Schlüssel (-> Google), aber die drei schienen mir erstmal die wichtigsten.

      Wichtig ist, dass man sich auch irgendwann wieder ausloggt mit der SID, denn bei zu vielen User-Sessions lässt das Gerät keinen neuen mehr rein (auch nicht über die grafische Oberfläche) und löscht offene Sessions gefühlt erst nach 12 Stunden. Auch schnell aufeinander folgende Logins scheint er nicht zu mögen, da blockt er gerne mal den Client für eine Minute komplett.
      Ausloggen geht über einen POST mit leerem Inhalt an https://[ip vom sma]/dyn/logout.json.json?sid=[erhaltene SID]

      Das ganze läuft bei mir bisher relativ problemlos und liefert zuverlässig die aktuellen Werte.

      posted in ioBroker Allgemein
      M
      Magda
    • RE: Xiaomi Yeelight Smart LED (DE)

      Die Steuerung des Yeelight Smart Strip funktioniert mit dem Script auch sehr gut, am Wochenende getestet.

      Und falls es jemand wissen will, an den Schnittmarken und den Lötstellen kann man den Strip auftrennen und auch neu verbinden mit bspw. LED Eckverbindern. Der Strip hat 4 Pins und etwas tricky ist die transparente Isolierschicht unter der weißen Isolierschicht, die man abkratzen muss um Kontakt zu bekommen.

      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: Xiaomi Yeelight Smart LED (DE)

      So, hab jetzt die Gruppensteuerung drin und bei mir läuft das mit 2 Lampen auch schon eine ganze Weile stabil.

      Damit die Gruppensteuerung bei vorhandener Nutzung funktioniert muss man den Datenpunkt "group" entweder manuell anlegen, oder den Yeelight-Baum komplett löschen, damit der automatisch neu angelegt wird.

      Die Funktion der Gruppensteuerung ist recht simpel. Lampen, die die gleiche Gruppennummer haben erhalten die gleichen Kommandos. Ich hab dafür im VIS einen Schieberegler der nur die Werte 1,2 und 3 annehmen kann. Das kann aber jeder machen wie er lustig ist.

      Hier das Script zum Anlegen der Lampen (lesen des Broadcast):

      var dgram = require('dgram');
      var s = dgram.createSocket('udp4');
      var debug = true;
      
      const MULTICAST_IP = '239.255.255.250';
      const s_dataset = 'javascript.0.Yeelight.Bulb';
      const s_id = '.id';
      const s_address = '.Location';
      const s_bright = '.bright';
      const s_hue = '.hue';
      const s_colorMode = '.color_mode';
      const s_rgb = '.rgb';
      const s_sat = '.sat';
      const s_power = '.power';
      const s_ct = '.ct';
      const s_name = '.name';
      const s_group = '.group';
      
      s.bind(1982, function() {
      	s.addMembership(MULTICAST_IP);
      	if (debug) console.log("listening on all addresses");
      });
      
      s.on("message", function (msg, rinfo) {
      	if (debug) console.log('Broadcast empfangen: ' + msg);
      	if (msg.indexOf('yeelight') < 0) {
      	    if (debug) console.log("Kein Yeelight Broadcast");
      	    return;
      	}
      	var bulbID = extractValue('id: ', msg);
      	var i = 1;
      	var unknownBulb = true;
      
      	//wenn Lampe vorhanden, dann Werte aktualisieren
      	while (getObject(s_dataset + i + s_id)) {
      		if (getState(s_dataset + i + s_id).val == bulbID) {
      			setState(s_dataset + i + s_address, extractValue('Location: ', msg), false);
      			setState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), true);
      			setState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), true);
      			setState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), true);
      			setState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), true); //Wert umgewandelt von Dec zu Hex damit Colorpicker Widget einfacher zu nutzen ist
      			setState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), true);
      			setState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), true);
      			setState(s_dataset + i + s_power, extractValue('power: ', msg), true);
      			unknownBulb = false;
      			if (debug) console.log('Werte für Lampe ' + i + ' aktualisiert');
      			break;
      		}
      		i++;
      		//Notaus
      		if (i >= 100) {
      			if (debug) console.log('zu viele Schleifendurchläufe');
      			break;
      		}
      	}
      	//wenn Lampe nicht gefunden, dann neue Lampe erstellen
      	if (unknownBulb) {
      		if (debug) console.log('neue Lampe wird erstellt');
      		createNewBulb(i, msg);  
      	}
      });
      
      function createNewBulb(i, msg) {
      	createState(s_dataset + i + s_id, extractValue('id: ', msg), {read: true, write: true, desc: "unique ID der Yeelight Lampe", type: "string", def: ""});
      	createState(s_dataset + i + s_address, extractValue('Location: ', msg), {read: true, write: true, desc: "URL der Yeelight Lampe", type: "string", def: ""});
          createState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), {read: true, write: true, desc: "Helligkeit", type: "number", min: 1, max: 100, def: 1, unit: "%"});
      	createState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), {read: true, write: true, desc: "HSV Farbwert", type: "number", min: 0, max: 359, def: 1, unit: ""});
      	createState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), {read: true, write: true, desc: "Farbwert", type: "number", min: 1, max: 3, def: 1, unit: ""});
      	createState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), {read: true, write: true, desc: "RGB Farbwert in HEX", type: "string", def: ""});
      	createState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), {read: true, write: true, desc: "HSV Sättigung", type: "number", min: 1, max: 100, def: 1, unit: ""});
      	createState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), {read: true, write: true, desc: "Farbtemperatur weiß", type: "number", min: 1700, max: 6500, def: 5000, unit: ""});
      	createState(s_dataset + i + s_power, extractValue('power: ', msg), {read: true, write: true, desc: "Zustand on/off", type: "string", def: ""});
          createState(s_dataset + i + s_name, '', {read: true, write: true, desc: "selbst vergebener Name", type: "string", def: "Yeelight"});
      	createState(s_dataset + i + s_group, i, {read: true, write: true, desc: "Gruppe", type: "number", min: 1, max: 100, def: 1, unit: ""});
      	if (debug) console.log('neue Lampe erstellt mit ID: ' + i);
      }
      
      function extractValue(key, message) {
          var text = message.toString('utf-8');
          var startPos = (text.indexOf(key) + key.length);
          var endPos = text.substring(startPos).indexOf('\r\n');
          return text.substr(startPos, endPos);
      }
      
      // close connection if script stopped
      onStop(function (callback) {
          if (s) {
              // close connection
              s.close();
              if (debug) console.log('UDP Client gestoppt');
          }
          callback();
      }, 2000 /*ms*/); 
      
      

      Hier das Script zum Steuern der Lampen:

      var net = require('net');
      var clients = [];
      var debug = true;
      
      const switchEffect = 'smooth'; //smooth or sudden
      const switchEffectTime = 1000; // min value 30
      
      const s_dataset = 'javascript.0.Yeelight.Bulb';
      const s_bright = '.bright';
      const s_hue = '.hue';
      const s_colorMode = '.color_mode';
      const s_rgb = '.rgb';
      const s_sat = '.sat';
      const s_power = '.power';
      const s_ct = '.ct';
      const s_name = '.name';
      const s_group = '.group';
      const s_location = '.Location';
      
      function createClient(bulbID, location) {
          var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
          var ipAddress = (new RegExp('(?:[0-9]{1,3}\.){3}[0-9]{1,3}')).exec(location)[0];
      	clients[bulbID - 1] = net.createConnection(port, ipAddress);
      	if (debug) console.log('Client erstellt für Lampe ' + bulbID);
      
      	clients[bulbID - 1].on('data', function(data) {
      		if (debug) console.log('Empfangen: ' + data);
      		notificationReceived(bulbID, data)
      	});
      
      	clients[bulbID - 1].on('close', function() {
      	    if (debug) console.log('Verbindung geschlossen');
      	}); 
      
      	clients[bulbID - 1].on('error', function() {
      		if (debug) console.log('Verbindung fehlerhaft');
      	}); 
      }
      
      function killClient(bulbID) {
      	if (clients[bulbID - 1]) {
      		clients[bulbID - 1].destroy();
      		if (debug) console.log('Client beendet für Lampe ' + bulbID);
      	}
      }
      
      function sendBulbCommand(bulbID, changedValue, param1, effect, effectTime) {
      	var command;
          switch (changedValue) {
              case 'ct':
                  command = '{"id":' + bulbID + ',"method":"set_ct_abx","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'rgb':
                  command = '{"id":' + bulbID + ',"method":"set_rgb","params":[' + parseInt(param1.substring(1), 16) + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'hue':
      			var sat = getState(s_dataset+ bulbID + '.sat').val;
                  command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + param1 + ', ' + sat + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
      		case 'sat':
      			var hue = getState(s_dataset + bulbID + '.hue').val;
                  command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + hue + ', ' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;	
              case 'bright':
                  command = '{"id":' + bulbID + ',"method":"set_bright","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'power':
                  command = '{"id":' + bulbID + ',"method":"set_power","params":["' + param1 + '", "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'toggle':
                  command = '{"id":' + bulbID + ',"method":"toggle","params":[]}\r\n';
                  break;
      		case 'name':
      			command = '{"id":' + bulbID + ',"method":"set_name","params":["' + param1 + '"]}\r\n';
      			break;	
              default:
                  if (debug) console.log('Unbekanntes Kommando');
                  return;
          }
          if (debug) console.log(command);
      
          var commandClient = new net.Socket();
          //if (debug) console.log(clients[bulbID - 1].remoteAddress);
          //if (debug) console.log(clients[bulbID - 1].remotePort);
      
          var location = getState(s_dataset + bulbID + s_location).val;
          var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
          var ipAddress = (new RegExp('(?:[0-9]{1,3}\.){3}[0-9]{1,3}')).exec(location)[0];
      
          try {
              commandClient.connect(port, ipAddress, function() {
                  commandClient.write(command); 
                  if (debug) console.log("CommandClient Command gesendet");
              });
              commandClient.on('data', function(data) {
                  if (debug) console.log('CommandClient empfangen: ' + data);
      	        commandClient.destroy(); // kill client after server's response
      	        if (debug) console.log('CommandClient beendet');
              });
              commandClient.on('error', function(ex) {
                  if (debug) console.log('CommandClient Fehler beim Verbinden');
              });
          } catch (err) {
              if (debug) console.log('CommandClient Fehler allgemein');
          }
      }
      
      function notificationReceived(bulbID, data) {
      	var notification = JSON.parse(data);
      	if (notification.params.power) {
      		setState(s_dataset + bulbID + s_power, notification.params.power, true);
      	}
      	if (notification.params.bright) {
      		setState(s_dataset + bulbID + s_bright, parseInt(notification.params.bright), true);
      	}
      	if (notification.params.ct) {
      		setState(s_dataset + bulbID + s_ct, parseInt(notification.params.ct), true);
      	}
      	if (notification.params.rgb) {
      		setState(s_dataset + bulbID + s_rgb, '#' + parseInt(notification.params.rgb).toString(16), true);
      	}
      	if (notification.params.hue) {
      		setState(s_dataset + bulbID + s_hue, parseInt(notification.params.hue), true);
      	}
      	if (notification.params.sat) {
      		setState(s_dataset + bulbID + s_sat, parseInt(notification.params.sat), true);
      	}
      	if (notification.params.color_mode) {
      		setState(s_dataset + bulbID + s_colorMode, parseInt(notification.params.color_mode), true);
      	}
      
      }
      
      //Subscribe für Änderung der Datenpunkte
      subscribe({id: /^javascript\.0\.Yeelight.Bulb.*/, change: 'any', ack: false}, function (obj) {
      	var bulbID = (new RegExp('^javascript\.0\.Yeelight.Bulb([0-9]?[0-9])\.')).exec(obj.id)[1];
      	var changedValue = (new RegExp('^javascript\.0\.Yeelight.Bulb[0-9]?[0-9]\.(.*)')).exec(obj.id)[1];
      	if (debug) console.log('Kommando für Lampe ' + bulbID + ' mit ' + changedValue);
      	if (changedValue == 'Location') {
      		killClient(bulbID);
      		createClient(bulbID, obj.state.val);
      	} else {
      		sendBulbCommand(bulbID, changedValue, obj.state.val, switchEffect, switchEffectTime);
      		//Änderung an Gruppe weitergeben
      		var group = parseInt(getState(s_dataset + bulbID + s_group).val);
      		if (group > 0 && changedValue != 'group' && changedValue != 'name') {
      		    if (debug) console.log('Kommando wird an Gruppe weitergegeben');
      		    var i = 1;
      			while (getObject(s_dataset + i + s_group)) {
      				if (debug) console.log('Schleifendurchlauf ' + i);
      				if (i == bulbID) { //sich selbst muss man nicht updaten
      				   if (debug) console.log('Gruppenmitglied bin ich selbst'); 
      				} else if (getState(s_dataset + i + s_group).val == group) { //jemand anderes ist in der gleichen Gruppe
      					sendBulbCommand(i, changedValue, obj.state.val, switchEffect, switchEffectTime);
      					if (debug) console.log('Lampe ' + i + ' in Gruppe ' + group + ' wurde angepasst');
      				} else {
      					if (debug) console.log('Lampe ' + i + ' nicht Mitglied in Gruppe ' + group);   
      				}
      				i++;
      			} 
      		}
      
      	}
      });
      
      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: Xiaomi Yeelight Smart LED (DE)

      @Lunax:

      (1) Yee-White = 192.168.0.144 - ping läuft `
      Ich hab leider keine weiße Yeelight, kann also auch nicht testen. Die API sollte aber trotzdem die gleiche sein. Hat es denn mit der Weißen jemals funktioniert? Ist dort der Developer-Modus eingeschaltet, damit lokale Verbindungen überhaupt erst zugelassen werden?

      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: Xiaomi Yeelight Smart LED (DE)

      @speedy78:

      ps: noch einen kleinen Tipp für mich wie ich unter Objekte Blub1 den Namen ändern kann und er in Zukunft den neuen Namen erkennt und Aktualisiert falls nötig. Sprich Zuordnung zum Raum würde ich gerne schon dort hinterlegen ist einfacher später wieder zu finden. Oder muss ich mir hier eine Extra Word Datei pflegen? `
      Die meisten Fragen scheinen sich ja schon geklärt zu haben :). Für meine Lösung werden die Shell-Scripte nicht benötigt, alles ist in diesen zwei Javascripten enthalten.

      Den Namen der Lampe kann man manuell in den Datenpunkt eintragen, der wird aber noch nicht auf die Lampe zurück geschrieben, ist somit also nur im ioBroker bekannt. Es gibt zwar die Methode set_name und die ist mit 2 Zeilen Code auch zu implementieren … warum ich das aber nicht gemacht habe weiß ich aktuell selber nicht mehr :).

      Also wenn genwünscht einfach die in den Switch in sendBulbCommand vor das default folgendes einfügen:

      case 'name':
      command = '{"id":' + bulbID + ',"method":"set_name","params":["' + param1 + '"]}\r\n';
      break;
      
      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: DB Zugverbindungen abfragen

      @mctom:

      danke für eure Antworten..

      @ Magda: Leider steht bei mir die Version 1.0 noch nicht zur Verfügung. Ich glaube ich muss sie mal manuell von github installieren.

      @ dna909: nutzt du die api schon ? hast du ein script im einsatz ?

      Gruß

      Michael `

      Hab mir die API auch mal angeschaut und die ganz schön schwer zu verdauen. Haufenweise Querverweise, keine direkt verknüpften Informationen.

      Den Parser auf 1.0 zu bekommen war am Ende recht einfach. In der Adapterliste oben auf "Install from costum URL" (Katzenkopf) und dann auf dem Tab github einfach den Parser auswählen aus der Liste.

      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: Xiaomi Yeelight Smart LED (DE)

      Die entscheidende Zeile ist die hier:

      script.js.common.yeelight.yee_control: Verbindung fehlerhaft
      

      Es konnte also keine Verbindung zur Lampe aufgebaut werden. In diesem Fall ist die Fehlerbehandlung noch recht rudimäntär (sprich nicht vorhanden).

      Da es nach dem "Neustart" der Lampen aber geklappt hat, würde ich vermuten, dass die Lampen bereits 4 TCP Verbindungen aufgebaut hatten. Das ist laut Dokumentation die Maximalzahl, weitere Verbindungsversuche werden von der Lampe abgelehnt.

      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    • RE: DB Zugverbindungen abfragen

      @mctom:

      Hat jemand einen Tipp wie ich bei dem Thema Abfahrtszeit nicht nur den ersten sondern alle 3 Ergebnisse zurückgeliefert bekommen ? `
      Mit der richtigen Parser-Version (1.0.0) und einer leicht geänderten RegExp geht das:

      Verbindungen:

      verbindung\.abfahrt.*?([0-9]?[0-9]:[0-9][0-9])
      

      Hier im Parser einfach die Abfahrten im Feld NUM hochzählen (0, 1, 2)

      Verspätungen:

      \>(\+[0-9]?[0-9])
      

      Hier im Parser die Werte um 2 hochzählen (0, 2, 4)

      Im Screenshot ein Beispiel mit 2 Zeiten.

      Und falls es interessant sein sollte, mit dem Parameter &journeyOptions=1 an der URL werden nur Direktverbindungen ausgegeben.
      3637_parser.jpg

      posted in Praktische Anwendungen (Showcase)
      M
      Magda
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo