Navigation

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

    NEWS

    • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    U
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 331
    • Best 46
    • Groups 2

    UlliJ

    @UlliJ

    ich bin übrigens nicht perfekt und ich arbeite auch nicht daran!

    60
    Reputation
    60
    Profile views
    331
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    UlliJ Follow
    Pro Starter

    Best posts made by UlliJ

    • RE: Zeigt her eure Vis2

      es ist etwas Arbeit aber die Seite mit der Energieübersicht ist soweit fertig...bis einem etwas neues einfällt.

      a39c346c-1b6b-487e-bdb6-4e806f24d796-image.png
      Edit: Damit es nicht so langweilig ist mit Animation für die Batterie (beim Entladen andersrum) und die Energieflüsse zwischen den einzelnen Teilen
      anibatt.gif

      Diagramme gehen auch
      fa653fb5-98ca-49d6-9359-19a0870ceb1a-image.png
      und der Rest, wie Zeit und Laune ist. Vis1 funktioniert ja parallel

      posted in Visualisierung
      U
      UlliJ
    • RE: Ölheizung für Luftwärmepumpenbetrieb testen?

      @dieter_p
      Hi,
      habe im Oktober '20 mit folgender Ausgangslage von Öl auf Luft-Wasser WP umgebaut:
      190m², Baujahr 1961, Fenster, Dach wärmetechnisch saniert in 2002, Fassade 2-schalig mit 5cm Luftschicht wie in Norddeutschland zu der Zeit üblich, keine Fußbodenerwärmung, Ölbrenner BJ 2002 mit 18kW, Hygienespeicher zur WW-Versorgung ebenfalls BJ 2002

      Ergänzend: PV Anlage mit 9,2kWp + Speicher. Bis auf den HK im Büro keine Umbauten an Heizkörpern

      Fazit nach dem 2. Winter: Funktioniert uneingeschränkt ... und das Haus ist CO2 frei. Die Elektroheizung der WP wurde nur bei Inbetriebnahme einmal verwendet und ist seitdem deaktiviert.

      Ob das im Einzelfall funktioniert oder nicht kann nicht pauschal beantwortet werden und leider haben die Heizungsbauer beim Thema Wärmepumpentechnik wissenstechnisch Nachholbedarf. Bei mir hat das Projekt 2 Jahre Vorlaufzeit gehabt um aus Gas, Brennstoffzelle, Hybridgeräten etc. etwas zukunftsfähiges auszuwählen. U.a. auch den für mich richtigen Heizungsbauer.

      Richtig ist, das bei 55°C die Wärmepumpen mit dem aktuell verbreitet eingesetztem Kältemittel (R410a) am Ende sind und darüber elektrisch zuheizen. Daher sinkt die Effizienz oder vielmehr das Verhältnis "thermisch abgegebene Leistung/elektrisch aufgenommener Leistung". R410a ist wegen seinem hohen GWP (1730) imho nicht mehr zeitgemäß.

      Falsch ist, daß es generell gilt! Seit ein paar Jahren gibt es Wärmepumpenhersteller, und werden mehr, die das etwas anspuchsvollere R290 (Propan), GWP=3, einsetzen. Anspruchsvoller, da der Gasdruck am Verdichterausgang höher ist und somit der Kältemittelkreislauf insgesamt höheren Gaskräften ausgesetzt ist. Weiter ist Propan leicht entflammbar, daher darf das Gerät nicht in geschlossenen Räumen aufgestellt werden. Vorteil ist das mögliche, höhere Temperaturniveau am Kondensator und somit am Wärmetauscher zum Heizkreis.

      Die Temperaturen von VL & RL alleine helfen Dir noch nicht. Eine weitere Frage ist, wieviel Leistung Dein Heizkreis kontinuierlich benötigt? Erst wenn die WP das nicht dauerhaft liefern kann wird es im Haus kälter aber nicht zwingend kalt.
      Thermische Energie von aussen wird nur zum Abtauen des Verdampfers benötigt. Das kann entweder der Heizkreis sein oder ein kleiner, seperater Puffer. Wenn alle Ventile im HK zu sind funktioniert das Abtauen nicht!

      Schau doch mal in Deinen Temperaturaufzeichnungen, wie oft und lang die VL Temperatur über 55°C war. Die erforderliche Wärmeleistung kannst Du näherungsweise über die Laufzeiten des Ölbrenners und dessen Düsenbestückung (=Ölverbrauch/Zeit) abschätzen.

      Das Projekt ist nicht hoffnungslos, die aktuelle Förderung in D von bis zu 45% bringt das ganze in eine ähnliche Größenordnung die für einen Umbau auf Gas fällig wäre. Und einen WW-Speicher kann man durch einen Hygienespeicher ersetzen, die >60°C im VL für WW Aufbereitung fallen damit auch weg. Wobei R290 das auch kann. Der COP sinkt etwas, aber das auch nur 1x pro Woche für 1 Stunde.
      VG

      posted in Off Topic
      U
      UlliJ
    • RE: Object Max Wert lässt setValue Wert nicht zu

      @mcm1957

      habe zwar den Kühlmodus nicht, nutze auch den Adapter nicht (ist jedoch noch installiert) aber trotzdem mal ein log angehängt.

      Habe dem Adapter vor dem Start den Objektbaum gelöscht. Zu Beginn kommt die Konfiguration der Anlage vom Portalserver

      20240819 konfig smartset.json

      Bei einzelnen Werten mit Auswahlmöglichkeit oder auch mehreren States, z.B. ID 27005000001 (aktueller Betriebsstatus des Heizgerätes) werden die min/max Werte vom Portal mitgeliefert.

      {"ValueId":27005000001,"SortId":4826,"SubBundleId":0,"ParameterId":27005000001,"IsReadOnly":true,"NoDataPoint":false,"IsExpertProtectable":false,"Name":"Betriebsart Heizgerät","Group":"410_Einstellungen und Anzeigen","ProtGrp":"HG <1>","ControlType":1,"Value":"15","ValueState":1,"HasDependentParameter":false,"ListItems":[{"Value":"0","DisplayText":"ODU Test","IsSelectable":true,"HighlightIfSelected":false},{"Value":"1","DisplayText":"Test","IsSelectable":true,"HighlightIfSelected":false},{"Value":"2","DisplayText":"Frostschutz HK","IsSelectable":true,"HighlightIfSelected":false},{"Value":"3","DisplayText":"Frostschutz Warmwasser","IsSelectable":true,"HighlightIfSelected":false},{"Value":"4","DisplayText":"Durchfluss gering","IsSelectable":true,"HighlightIfSelected":false},{"Value":"5","DisplayText":"Vorwärmung","IsSelectable":true,"HighlightIfSelected":false},{"Value":"6","DisplayText":"Abtaubetrieb","IsSelectable":true,"HighlightIfSelected":false},{"Value":"7","DisplayText":"Antilegionellenfunktion","IsSelectable":true,"HighlightIfSelected":false},{"Value":"8","DisplayText":"Warmwasser","IsSelectable":true,"HighlightIfSelected":false},{"Value":"9","DisplayText":"WW-Nachlauf","IsSelectable":true,"HighlightIfSelected":false},{"Value":"10","DisplayText":"Heizbetrieb","IsSelectable":true,"HighlightIfSelected":false},{"Value":"11","DisplayText":"HZ-Nachlauf","IsSelectable":true,"HighlightIfSelected":false},{"Value":"12","DisplayText":"Aktive Kühlung","IsSelectable":true,"HighlightIfSelected":false},{"Value":"13","DisplayText":"Kaskade","IsSelectable":true,"HighlightIfSelected":false},{"Value":"14","DisplayText":"GLT","IsSelectable":true,"HighlightIfSelected":false},{"Value":"15","DisplayText":"Standby","IsSelectable":true,"HighlightIfSelected":false},{"Value":"16","DisplayText":"Pump Down","IsSelectable":true,"HighlightIfSelected":false},{"Value":"17","DisplayText":"Nachlauf K","IsSelectable":true,"HighlightIfSelected":false},{"Value":"18","DisplayText":"Undefiniert","IsSelectable":true,"HighlightIfSelected":false},{"Value":"19","DisplayText":"Pool","IsSelectable":true,"HighlightIfSelected":false}],"MinValueCondition":"0","MaxValueCondition":"19","MinValue":0,"MaxValue":19,"TileParameterTagType":1}
      

      Das ganze log hier noch als file (Autorisierung und token entfernt)
      20240819 startup log smartset.json

      Aus meiner Sicht ist der Fehler auf der Portalseite. Da werden die falschen Grenzwerte geliefert. Betroffene könnten mal im Portal direkt versuchen den Wert umzustellen. Steht er da überhaupt zur Verfügung??? Dann sollte die Konfiguration der Anlage im Heizraum überprüft werden. Schließlich kommen die Daten vom ISM7 in der Heizung.
      Mangels Kühlmodus hier die Betriebsart der Heizung als Beispiel
      d9d0b9c2-2642-4197-87b5-bf3efb942651-image.png

      Wenn es da geht, vielleicht mal den Wolf support darauf ansetzen.

      Hoffe das hilft bei der weiteren Analyse
      VG

      posted in Skripten / Logik
      U
      UlliJ
    • RE: [Guide] Zwangsumstellung auf Smartmeter: Freut Euch drauf!

      hier auch... seit ein paar Tagen
      ad9d57cd-7b80-4073-836b-9c5941f25629-image.png

      Mobilfunkantenne liegt auf dem Schrank
      Lesekopf auf die IR-Schnittstelle gesetzt, Skript angepasst und siehe da es plaudert ausgiebigst vor sich hin
      2 Stunden nach der Installation war der Zähler beim Meßstellenbetreiber aktiv und die Pin online im Kundenportal verfügbar
      die HAN Schnittstelle wird bis auf weiteres ignoriert, ist alles da was gebraucht wird

      Jetzt nur noch warten bis der Zähler auch beim Stromversorger angekommen ist...
      Alles in allem top gelaufen!

      posted in Praktische Anwendungen (Showcase)
      U
      UlliJ
    • RE: Zeigt her eure Vis2

      @chiller
      so sehen bei mir die ersten Gehversuche aus

      fb37cc8c-a7e4-4ad0-bdcc-756e98c2ffcc-image.png
      348bd045-b8b1-4f0a-977d-218d92705131-image.png
      f04767a5-988d-4031-8842-f8ac97edd372-image.png
      e865ead0-6c92-450f-a6d5-fec169d39fd2-image.png
      unendliche Spielwiese und noch viel zu machen.
      Der intensive Gebrauch der Diagrammfunktionen in den Widgets "Istwert mit Diagramm" oder "Schalter oder Knöpfe" lässt meine InfluxDB reproduzierbar abschmieren. Ist aber ein anderes Ding.

      posted in Visualisierung
      U
      UlliJ
    • RE: Solarpanels als Vorsatzfassade vor Außendämmung?

      @martinp sagte in Solarpanels als Vorsatzfassade vor Außendämmung?:

      Ob es sich lohnt die Panels quasi als oberste Schicht in die Fassade zu Integrieren um beim Fassadenaufbau bei den abgedeckten Flächen Kosten zu sparen, scheint mir bei den Panelpreisen naheliegend.

      Die Idee scheint auf den ersten Blick gut, aber ich glaube sparen wirst Du nicht wirklich...was zu beweise wäre. Ist ja nur ein Szenario.

      Da gibt es IMHO zwei Herausforderungen:

      1. die normalen Module sind eine Kombi aus Aluminiumrahmen und Glas/Kunststoff und bekanntlich mit Abstand rundherum montiert. Die Befestigung begrenzt normalerweise Spannungen die durch thermische Ausdehnung entstehen. Zwischen Winter und Sommer hat man sicher ein delta T von 50-70°C, eher mehr. Damit verlängern/verkürzen sich die Rahmenprofile je Modul um ein paar mm. Über die Giebelhöhe kommen da dann schon cm zusammen
        damit zu
      2. Dicht von außen: widerspricht Nr. 1.
        Die anderen Funktionen der Fassade wie Dämmung, Dampfdurchlässigkeit etc. lassen wir mal weg.

      Es gibt von Velux ein Indachsystem für PV Anlagen (https://magazin.velux.de/de-DE/artikel/indach-photovoltaik). Ob das Fassadentauglich ist wäre zu klären.
      Ein zweiter Ansatz dafür könnte die Einfassung mit Dichtung von transparenten Modulen sein, wie sie z.B. für Dächer von Wintergärten, Carports oder ähnlichem gemacht wird. Aber die transparenten Module bestehen nur aus Glas und haben daher das Thema zu 1 nicht.
      Wahrscheinlich läuft es auf eine Art vorgehängte, hinterlüftete Fassade hinaus. Dafür braucht es dann wieder spezielle Befestigungssysteme, soll ja wieder 30 Jahre+ halten.
      Offen ist dann immer noch was mit den Teilen der Fassade passiert, die nicht mit Modulen abgedeckt werden können/sollen.

      über den Daumen ... gegenüber einer herkömmlichen Fassade ist da kein Preisvorteil. PV Module können die Fassadenfunktion nicht vollständig übernehmen, dafür sind sie auch nicht gedacht.
      VG

      posted in Off Topic
      U
      UlliJ
    • RE: Frage : Migrate MySQL nach Influxdb

      Moin zusammen,

      mein erster post in diesem Forum...
      Zu aller erst vielen Dank für diese tolle Plattform und den vielen die mit enormem Aufwand das smarte home nach vorne treiben, tolle Ideen weiter geben, absolut geile Visualisierungen bauen usw. Ich habe bislang selten ein Forum gesehen, in dem so konstruktiv und freundlich miteinander umgegangen wird...weiter so 👍

      Seit ca 2 Jahren betreibe ich Iobroker und habe bislang die Daten zuerst in MySQL und später dann in PostgreSQL abgelegt. Über die Zeit wurden die ganzen Abfragen und Diagramme mit Grafana nach und nach deutlich träger. Nach kurzer Testphase mit InfluxDB war die Frage geklärt😎
      Mit dem Wechsel auf InfluxDB stellt sich die Frage für den nicht Programmierer wie die Daten von alt nach neu...

      Die genannten Lösungen haben bei mir nicht zuverlässig funktioniert also die nächste Klappe

      1. In einem SQL GUI (phpmyadmin, HeidiSQL oder DBeaver, etc) oder auf der SQL-Konsole die zu exportierenden Daten in einem View zur Verfügung stellen
        Der View enthält alles was Influx benötigt
      create view xxx as
      SELECT datapoints.name,
      	ts_number.ack    as "ack",
          (ts_number.q*1.0)       as "q",
      	sources.name as "from",
          (ts_number.val*1.0)     as "value",
          (ts_number.ts*1000000) as "time"
      from ts_number 
      left join datapoints
      on ts_number.id=datapoints.id
      left join sources
      on ts_number._from=sources.id
      where datapoints.id>=70 and datapoints.id<=73 and q=0
      order by ts_number.ts desc;
      

      "xxx" Name des View anpassen
      in der WHERE Klausel die Datenpunkte entsprechend anpassen, einen Bereich wie hier oder auch eine einzelne id
      Für kleine Datenbestände kann die WHERE Klausel auch auf "WHERE q=0" gesetzt werden und über den View in einem Rutsch in Influx übertragen werden.
      Beispiel:
      59cd61b2-aab9-4cf5-8c14-f16d1e595125-grafik.png

      1. Python installieren und ggf. die Zusätze installieren
      • psycopg2 für PostgreSQL bzw. MySQLdb für MySQL
      • influxdb-client und influxdb.
      1. das Skript von Muntazir Fadhel "Easily Migrate Postgres/MySQL Records to InfluxDB" nehmen (modifizierte Variante hier)
      ### MySQL DB info ###
      #import MySQLdb
      #conn = MySQLdb.connect(host="localhost",  # your host, usually localhost
      #                     user="john",         # your username
      #                     passwd="megajonhy",  # your password
      #                     db="jonhydb")        # name of the data base
      
      
      ### PostgreSQL DB info ###
      import psycopg2
      import psycopg2.extras
      
      #####
      # connection data for PostgreSQL
      conn = psycopg2.connect("dbname=xxx user=xxx password=xxx host=xxx.xxx.xxx.xxx port =5432")
      #####
      
      # InfluxDB info #
      from influxdb import InfluxDBClient
      #
      #####connection data for InfluxDB#####
      influxClient = InfluxDBClient(host='xxx.xxx.xxx.xxx', port=8086, username='xxx', password='xxx', database='xxx')
      #####
      #influxClient.delete_database(influx_db_name)
      #influxClient.create_database(influx_db_name)
      
      # dictates how columns will be mapped to key/fields in InfluxDB
      schema = {
          "time_column": "time", # the column that will be used as the time stamp in influx
          "columns_to_fields" : ["ack","q", "from","value"], # columns that will map to fields 
          # "columns_to_tags" : ["",...], # columns that will map to tags
          "table_name_to_measurement" : "name", # table name that will be mapped to measurement
          }
      
      '''
      Generates an collection of influxdb points from the given SQL records
      '''
      def generate_influx_points(records):
          influx_points = []
          for record in records:
              #tags = {}, 
              fields = {}
              #for tag_label in schema['columns_to_tags']:
              #   tags[tag_label] = record[tag_label]
              for field_label in schema['columns_to_fields']:
                  fields[field_label] = record[field_label]
              influx_points.append({
                  "measurement": record[schema['table_name_to_measurement']],
                  #"tags": tags,
                  "time": record[schema['time_column']],
                  "fields": fields
              })
          return influx_points
      
      
      
      # query relational DB for all records
      curr = conn.cursor('cursor', cursor_factory=psycopg2.extras.RealDictCursor)
      # curr = conn.cursor(dictionary=True)
      #####
      # SQL query for PostgreSQL, syntax for MySQL differs
      # query provide desired columns as a view on the sql server
      
      # request data from SQL, adjust ...from <view name>
      curr.execute("Select * from xxx;")
      #####
      row_count = 0
      # process 1000 records at a time
      while True:
          print("Processing row #" + str(row_count + 1))
          selected_rows = curr.fetchmany(1000)
          influxClient.write_points(generate_influx_points(selected_rows))
          row_count += 1000
          if len(selected_rows) < 1000:
              break
      conn.close()
      
      

      Im Skript sind

      • in Zeile 15 die Datenbankverbindung für Postgre anzupassen,
      • in Zeile 22 die Datenbankverbindung für Influx
      • weiter unten Zeile 65 statt xxx ist der Name des Views einzutragen der auf der Datenbank mit der Abfrage aus 1 erzeugt wurde
        curr.execute("Select * from xxx;")
      • der Abschnitt "schema" gibt das mapping der Spalten vor und muss nur angepasst werden wenn die Spaltenbezeichner in der Abfrage aus 1 geändert werden
      • für die MySQL user sind die Verbindungsdaten in den Zeilen 2-6 auskommentiert und an eure Umgebung anzupassen.
      1. In der Python Umgebung das Skript starten...alle 1000 Zeilen/Datensätze kommt eine Fortschrittsmeldung. Während die Abfrage auf der SQL Seite läuft steht da "Processing row # 1"

      Bei umfangreichen Abfragen und je nach Umgebung kann das Ganze ein wenig dauern. Teilweise dauerten bei mir die SQL Abfragen bis zu 20min bei 20Mio Datensätzen (Nuc i3 mit 12GB für die SQL VM unter proxmox). Das Skript läuft zuverlässig und mehrere 10 Mio Datensätze von A nach B wurden migriert. Vielleicht kann es jemand brauchen und nochmals Danke für das tolle Projekt und die hilfsbereiten Menschen hier
      VG
      Ulli

      posted in ioBroker Allgemein
      U
      UlliJ
    • RE: EnigmaAdapter Timer-Liste auslesen

      @iobroker_user
      Hi Frank,

      bin auch nicht fit in Blockly und JS... aber üben hilft
      Versuch das mal nachzubauen, die Kommentare sollten erklären was passiert.
      Zeitplan ggf. an Deine Wünsche anpassen.

      4d74a51a-8911-42dd-b79f-358a42aa867a-grafik.png

      Das Json dazu sieht mit einem Timer so aus:
      ba1cb142-d0f6-4a5f-ae5f-5aece2836577-grafik.png

      Viel Vergnügen

      posted in Blockly
      U
      UlliJ
    • RE: Kühlschrank Thermostat umbauen / Smart machen

      @ilovegym sagte in Kühlschrank Thermostat umbauen / Smart machen:

      Der Verdampfer ist das hinten innen im Kuehlschrank, dort wird das durch den Druck des Verdichters(Kompressors) verfluessigte Kaeltemittel durch die Waerme im inneren des Kuehlschranks zum verdampfen gebracht.
      Aggregatszustand aendert sich, das Kaeltemittel dehnt sich aus und kommt in den Verfluessiger hinten aussen am Kuehlschrank, wo es die Waerme abgibt und sich wieder abkuehlt, durch den Verdichter laeuft, wieder komprimiert wird

      darf ich das etwas ergänzen? zum Teil OT
      der Verdampfer ist das hinten innen im Kühlschrank wo flüssiges Kältemittel verdampft (Isobutan/R600a hat einen Siedepunkt von -12°C) und dem Innenraum dadurch Energie entzieht. Der Verdichter saugt dieses Gas an, erhöht Druck und Temperatur, schiebt das in den Verflüssiger. Im Verflüssiger, hoher Druck und eingangs auch hohe Temperatur, wird das flüssige Kältemittel zunächst abgekühlt (Raum ist kälter als der Verflüssiger). Am Ausgang des Verflüssigers sitzt die Kapillare, hier wird das Gemisch aus Gas und teilweise kondensiertem Kältemittel entspannt (Druck gering und Temperatur niedrig) und geht damit vollständig in den flüssigen Zustand über... im Verdampfer geht das Spiel dann wieder von vorne los.

      Die Verdichter sind zum pumpen von Gas gedacht. Wenn flüssiges Kältemittel angesaugt wird werden die dünnen Ventilplättchen der Saugseite beim komprimieren verformt und damit zerstört (wird Flüssigkeitsschlag genannt). Die Abstimmung der Wärmetauscherflächen, Kältemittelmenge, Kapillare, Größe des Verdichters und Klimazone ist daher wichtig.
      Der Verdichter selbst ist eine Kolbenpumpe mit kleinem 1~Asynchronmotor mit Haupt- und Hilfswicklung. Die Hilfswicklung erzeugt durch die Anordnung im Wicklungspaket das Drehfeld um ein Startmoment zu generieren. Zwischen Thermostat und Motor sitzt ein PTC der die Hilfswicklung im Betrieb weg schaltet. Ist der Verdichter gestartet, wird der PTC warm und schaltet die Hilfswicklung bei Temperatur x aus um Energie zu sparen. Ist die Temperatur am Thermostat erreicht wird der Verdichter ausgeschaltet. Würde man jetzt den Stecker aus der Steckdose ziehen und wieder rein stecken passiert zunächst mal: nix. Der PTC ist noch zu warm, die Hilfswicklung ist ausgeschaltet und der Motor hat kein Startmoment. Gleichzeitig kann während des Abkühlens des PTC der Kältekreis den Druck im Verflüssiger über die Kapillare abbauen. Somit hat der Verdichter beim nächsten Einschalten keinen oder nur geringen Gegendruck...wenn denn alles richtig ausgelegt ist und nicht defekt oder gar undicht.

      Die Geschichte mit dem PTC gilt nur für ungeregelte Verdichter. Es gibt auch Schaltungen mit Relais am Verdichter, aber für Haushaltskühlschränke ist der PTC aus Kostengründen eigentlich Standard.

      @bananajoe sagte in Kühlschrank Thermostat umbauen / Smart machen:

      @ilovegym ah, danke, der Fühler sitzt also in dem Bereich wo die Kälte erzeugt wird.
      Ich habe eine Zwangspause von 15 Minuten nach dem Schalten eingebaut, die Positionierung des Temperatursensors wird noch optimiert.

      Wenn er immer einschaltet dann gut. Falls nicht ist der PTC oder der Thermostat schuld

      posted in Off Topic
      U
      UlliJ
    • RE: Wolf Link Home, ISM7i, ISM8i - Was ist nötig?

      @bongo
      das Ism7i=Home Link. Und das brauchst Du für das Portal oder den ism7mqtt.

      Beides gleichzeitig geht nicht. Das ISM7i kann entweder am Portal hängen oder lokal im LAN. Aber Du kannst jederzeit in beide Richtungen wechseln, wenn auf dem ism7i das Portal aktiviert oder eben deaktiviert wird.

      Für die Installation liest Du am Besten hier ganz weit unten (17.12.2023). Das ist die Installation und Einrichtung unter Linux und dürfte die meisten der Fragen schon beantworten. Zweite Quelle ist noch das github repository ism7mqtt.

      Dann solltest Du klar sein wo Du den Dienst installieren willst. Bei mir läuft das als kleiner LXC unter proxmox unabhängig vom iob oder anderen Diensten. Sollte grundsätzlich auch auf der iobroker Maschine laufen können.

      Der Baum der DP's sieht etwas seltsam aus, aber es ist alles da was am Bus der Wolf Steuerung hängt. Vermutlich sind die mqtt topics noch nicht entsprechend aufgesetzt (habe keine Ahnung davon). Geht und gut.

      4a210500-e53a-44d6-8c4e-0ab53b9895c0-image.png

      Steuern geht auch, zumindest bei den wenigen DP's für die ich das bislang gemacht habe (WW Aufbereitung Temperatur setzen und starten, Heizkurve absenken/anheben).

      Das es Login Schwierigkeiten mit dem Wolf-smartset gab ist völlig an mir vorbei gelaufen, da hatte ich schon gewechselt.
      Wenn Du Hilfe brauchst meld Dich einfach. Bin auch nicht der crack, habe das aber nach einem Hinweis relativ schnell am Rennen gehabt.
      VG
      Ulli

      posted in ioBroker Allgemein
      U
      UlliJ

    Latest posts made by UlliJ

    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @mcu sagte in Test Adapter flexcharts - Stapeldiagramme und mehr:

      Zeig mal bitte das HTML

      gehört eigentlich nicht hier in das Thema...
      Nein, manuell als Vorlage für die anderen Diagramme (kann kein JS)

      <!DOCTYPE html>
      <html lang="de">
      <head>
        <meta charset="UTF-8" />
        <title>PV Hochbeet Leistung</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <style>
          body {
            margin: 0;
            background: rgba(0,0,0,0);
            color: #fff;
            font-family: sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
          }
          #chart {
            width: 90vw;
            height: 90vh;
          }
        </style>
      
        <!-- Lokale ECharts-Dateien -->
        <script src="./echarts.min.js"></script>
        <script src="/lib/js/socket.io.js"></script>
      </head>
      
      <body>
        <div id="chart"></div>
      
        <script>
          // ioBroker States
          const STATE_P1 = '0_userdata.0.4000_EnergieErzeugung.PV.pacPVOst';
          const STATE_P2 = '0_userdata.0.4000_EnergieErzeugung.PV.pacPVInnenhof';
          const STATE_P3 = '0_userdata.0.4000_EnergieErzeugung.PV.pacPVHochbeet';
          const STATE_P4 = '0_userdata.0.4000_EnergieErzeugung.PV.pacPVWest';
      
          let p1 = 0, p2 = 0, p3 = 0, p4 = 0;
      
          const socket = io.connect(window.location.origin);
          const chart = echarts.init(document.getElementById('chart'));
      
          // === Grundkonfiguration aus deiner JSON-Vorlage ===
          const option = {
            "tooltip": { "show": false, "trigger": "item" },
            "textStyle": { "fontFamily": "sans-serif", "fontSize": 14 },
            "legend": {
              "top": "20%",
              "left": "0%",
              "show": true,
              "align": "left",
              "orient": "vertical",
              "textStyle": { "color": "#ffffff", "opacity": 0.5 }
            },
            "series": [
              {
                "name": "PV Leistung",
                "type": "pie",
                "startAngle": 90,
                "padAngle": 3,
      		  "animation": true,
      	  "animationThreshold": 2000,
            "animationDuration": 500,
      	  "animationDelay": 0,
            "animationDurationUpdate": 1500,
            "animationEasing": "cubicInOut",
            "animationEasingUpdate": "cubicInOut",
            "animationTypeUpdate": "transition",
                "radius": ["35%", "55%"],
                "center": ["75%", "40%"],
                "color": ["#406036", "#d387d6", "#c215b0", "#737B1A"],
                "label": {
                  "show": false,
                  "color": "#ffffff"
                },
                "avoidLabelOverlap": true,
                "itemStyle": {
                  "borderRadius": 6,
                  "borderColor": "#fff",
                  "borderWidth": 0
                },
                "labelLine": { "show": false },
                "data": [
                  { "value": 0, "name": "Ost 0 W" },
                  { "value": 0, "name": "Haus 0 W" },
                  { "value": 0, "name": "Hochbeet 0 W" },
                  { "value": 0, "name": "West 0 W" }
                ]
              }
            ]
          };
      
          chart.setOption(option);
      
          // === Datenaktualisierung ===
          function updateChart() {
            const newData = [
              { value: p1, name: `Ost ${p1.toFixed(0)} W` },
              { value: p2, name: `Haus ${p2.toFixed(0)} W` },
              { value: p3, name: `Hochbeet ${p3.toFixed(0)} W` },
              { value: p4, name: `West ${p4.toFixed(0)} W` }
            ];
      
            chart.setOption({
              series: [{
                name: "PV Leistung",
                data: newData
              }]
            });
          }
      
          // === ioBroker Verbindung ===
          socket.on("connect", () => {
            socket.emit("subscribe", STATE_P1);
            socket.emit("subscribe", STATE_P2);
            socket.emit("subscribe", STATE_P3);
            socket.emit("subscribe", STATE_P4);
          });
      
          socket.on("stateChange", (id, state) => {
            if (!state || state.val === undefined) return;
            if (id === STATE_P1) p1 = state.val;
            if (id === STATE_P2) p2 = state.val;
            if (id === STATE_P3) p3 = state.val;
            if (id === STATE_P4) p4 = state.val;
            updateChart();
          });
      
          window.addEventListener("resize", () => chart.resize());
        </script>
      </body>
      </html>
      
      
      posted in Tester
      U
      UlliJ
    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @legro
      danke für die ausführliche Erklärung, würde ich ggf. hinkriegen🙄

      Habe zwischenzeitlich einen anderen Ansatz über eine HTML-Seite mit socketio verfolgt, der mir ganz gut gefällt Hat aber nichts mehr mit flexcharts zu tun, daher OT.
      piechart.gif

      ist beide Male ein iframe-widget. Oben mit flexcharts, unten ohne. Animationszeiten und Aktualisierung gleich eingestellt. Mit Flexcharts verschwindet das Diagramm kurz vollständig, unten nicht.
      Muss mal sehen welcher Weg mir da besser gefällt um Grafana zu entsorgen. JS steht in jedem Fall auf der "Arbeitsliste".

      posted in Tester
      U
      UlliJ
    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @legro sagte in Test Adapter flexcharts - Stapeldiagramme und mehr:

      Dieses Feld wird via Binding mit einem Datenpunkt verbunden, in den man die Update-Zeit reinschreibt. Immer wenn dies geschieht, baut sich das iFrame mit dem Diagramm neu auf. Selbstverständlich muss zuvor das (als JSON) bereitgestellte Diagramm im zugrundeliegenden Datenpunkt aktualisiert worden sein.

      das wird probiert. Die Updatezeit setzt Du vermutlich anschließend wieder auf 0?
      Danke.

      posted in Tester
      U
      UlliJ
    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @jrbwh sagte in Test Adapter flexcharts - Stapeldiagramme und mehr:

      In welchem Kontext soll das Chart dargestellt werden? vis, jarvis, ...?

      nutze Vis-2.
      Die Aktualisierung selbst ist nicht das Problem. Mich stört nur das "flackern" beim neuaufbau, speziell wenn die Aktualisierungsrate hoch ist. Oder habt ihr das nicht?
      anders gesagt: die Animationsfunktionen von echarts funktionieren (bei mir) nicht.

      posted in Tester
      U
      UlliJ
    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @jrbwh
      danke Dir für die Antwort... ☺
      Dennoch ein tolles feature für iobroker

      posted in Tester
      U
      UlliJ
    • RE: Test Adapter flexcharts - Stapeldiagramme und mehr

      @jrbwh

      kann mir (JS ist ein Buch mit 7 Siegeln für mich) erklären, wie die automatische Aktualisierung von Diagrammen umgesetzt werden kann...

      Was ich habe:
      Script mit Definition eines Diagramms

      var strify = require('javascript-stringify');
      
      onMessage('chartCOP', (httpParams, callback) => {
         const myJsonParams  = (httpParams.myjsonparams ? JSON.parse(httpParams.myjsonparams) : {} );
         console.log(`httpParams = ${JSON.stringify(httpParams)}`);
         console.log(`myJsonParams = ${JSON.stringify(myJsonParams)}`);
         chartCOP(result => callback(result));
      });
         
      function chartCOP(callback) {
         const numVLact=getState("alias.0.1000_Heizung.WP.VLTemperatur").val;
         const numATact=getState("alias.0.1000_Heizung.Klima.AussenTemperatur").val;
         const numCOPact=getState("0_userdata.0.1000_Heizung.WP.COP").val;
         const VLmin=30;
         const VLmax=65;
         const ATmin=-10;
         const ATmax=20;
         const option = {
       "tooltip": {
         "show": false,
         "formatter": function (param) {
           return (
             "AT: " + param.value[0].toFixed(1) + "°C<br>" +
             "VL: " + param.value[1].toFixed(1) + "°C<br>" +
             "COP: " + param.value[2].toFixed(2)
           );
         }
       },
       "visualMap": {
         "show": false,
         "dimension": 2,
         "seriesIndex": 0,
         "min": 1,
         "max": 6,
         "inRange": {
           "color": [
             "rgba(139, 0, 0, 0.9)",    // Dunkelrot – niedriger COP
             "rgba(255, 69, 0, 0.85)",  // Orange-Rot
             "rgba(255, 205, 0, 0.8)",  // Gelb
             "rgba(0, 255, 127, 0.75)", // Hellgrün
             "rgba(64, 224, 208, 0.75)", // Türkis / Mittelblau
             "rgba(30, 144, 255, 0.8)",  // Kräftiges Blau
             "rgba(0, 0, 200, 0.85)"     // Tiefblau – hoher COP
           ]
         },
         "text": ["COP hoch", "COP niedrig"],
         "calculable": true
       },
       "xAxis3D": { "type": "value", "name": "AT (°C)", "min": ATmin, "max": ATmax, "interval": 5 },
       "yAxis3D": { "type": "value", "name": "VL (°C)", "min": VLmin, "max": VLmax, "interval": 5 },
       "zAxis3D": { "type": "value", "name": "COP", "min": 0, "max": 8, "interval": 1 },
       "grid3D": {
         "boxWidth": 100,
         "boxDepth": 60,
         "boxHeight": 45,
         "environment": "auto",
         "viewControl": {
           "alpha": 30,
           "beta": 225,
           "distance": 150,
           "minBeta": -360,
           "maxBeta": 360,
           "autoRotate": false,
           "center": [
             0,
             -12,
             0
           ]
         },
         "light": {
           "main": {
             "intensity": 1.4,
             "shadow": true,
             "alpha": 30,
             "beta": 120
           },
           "ambient": {
             "intensity": 0.5
           }
         }
       },
       "series": [
         {
           "type": "surface",
           "name": "statisches COP Netz",
           "wireframe": { "show": false },
           "shading": "realistic",
           "itemStyle": {
             "color": "rgba(0,150,255,0.4)",
             "opacity": 0.8
           },
           "realisticMaterial": {
             "roughness": 0.1,
             "metalness": 0
           },
           "data": (function() {
             const data = [];
             for (let AT = ATmin; AT <= ATmax; AT += 1) {
               for (let VL = VLmin; VL <= VLmax; VL += 1) {
                 const COP = 6.65 - 3.8 * Math.exp(-0.165 * (AT + 10)) +
                             0.00015 * VL * VL - 0.035 * VL;
                 if (COP > 1) {
                     data.push([AT, VL, COP]);
                 }
               }
             }
             return data;
           })()
         },
         {
           "type": "line3D",
           "name": "VL = aktuelle Temperatur",
           "lineStyle": { "width": 3, "color": "rgba(255,69,0,0.9)" },
           "data": (function() {
             const arrLine1 = [];
             let VL = numVLact;
             for (let AT = ATmin; AT <= ATmax; AT += 1) {
                 const COP = 6.65 - 3.8 * Math.exp(-0.165 * (AT + 10)) +
                           0.00015 * VL * VL - 0.035 * VL;
                 arrLine1.push([AT, VL, COP]);
             }
             return arrLine1;
           })()
         },
         {
           "type": "line3D",
           "name": "AT = aktuelle Temperatur",
           "lineStyle": { "width": 3, "color": "rgba(255,69,0,0.9)" },
           "data": (function() {
             const arrLine2 = [];
             for (let VL = VLmin; VL <= VLmax; VL += 1) {
               const COP = 6.65 - 3.8 * Math.exp(-0.165 * (numATact + 10)) +
                           0.00015 * VL * VL - 0.035 * VL;
               arrLine2.push([numATact, VL, COP]);
             }
             return arrLine2;
           })()
         },
         {
             type: "line3D",
             name: "COP = 4.3 Kontur",
             lineStyle: { color: "rgba(139, 0, 0, 0.7)", width: 2 },
             data: (function () {
             const arrcop = [];
             for (let AT = ATmin; AT <= ATmax; AT += 0.05) {
                 for (let VL = VLmin; VL <= VLmax; VL += 0.05) {
                 const cop = 6.65 - 3.8 * Math.exp(-0.165 * (AT + 10))
                        + 0.00015 * VL * VL - 0.035 * VL;
                 if (Math.abs(cop - 4.3) < 0.05) {  
               arrcop.push([AT, VL, cop]);
                 }
             }
             }
             return arrcop;
         })()
         },
         {
           "type": "scatter3D",
           "name": "real",
           //"symbol": "pin",
           "visualMap": false,
           "symbolSize": 20,
           "animation": true,
           "animationDuration": 800,
           "animationEasing": "cubicOut",
           "itemStyle": { "color": "rgba(0, 0, 200, 0.95)" },
           "data": (function() {
             return [[numATact, numVLact, numCOPact]];
           })()
         },
         {
             "type": "scatter3D",
             "name": "Projektion CHA",
             "symbolSize": 6,
             "visualMap": false,
             "itemStyle": { "color": "rgba(0, 0, 200, 0.95)" },
             "data": [
             [ATmax, VLmax, numCOPact]
             ]
         },
         {
           "type": "scatter3D",
           "name": "Betriebspunkt",
           //"symbol": "pin",
           "visualMap": false,
           "symbolSize": 10,
           "animation": true,
           "animationDuration": 800,
           "animationEasing": "cubicOut",
           "itemStyle": { "color": "rgba(255,69,0,0.9)" },
           "data": (function() {
             const COPaktuell = 6.65 - 3.8 * Math.exp(-0.165 * (numATact + 10)) +
                                0.00015 * numVLact * numVLact - 0.035 * numVLact;
             return [[numATact, numVLact, COPaktuell]];
           })()
         },
         {
             "type": "scatter3D",
             "name": "Projektion auf AT-Ebene",
             "symbolSize": 6,
             "visualMap": false,
             "itemStyle": { "color": "rgba(255,69,0,0.9)" },
             "data": [
                 [ATmin, numVLact, 0]
             ]
         },
         {
             "type": "scatter3D",
             "name": "Projektion auf VL-Ebene",
             "symbolSize": 6,
             "visualMap": false,
             "itemStyle": { "color": "rgba(255,69,0,0.9)" },
             "data": [
             [ATmax, VLmax, (6.65 - 3.8 * Math.exp(-0.165 * (numATact + 10)) +
                                0.00015 * numVLact * numVLact - 0.035 * numVLact)]
             ]
         },
         {
             "type": "scatter3D",
             "name": "Projektion auf COP-Basis",
             "symbolSize": 6,
             "visualMap": false,
             "itemStyle": { "color": "rgba(255,69,0,0.9)" },
             "data": [
                 [numATact, VLmax, 0]
             ]
         }
       ]
      };
      
         callback(strify.stringify(option));
      };
      

      Anzeige im Browser funktioniert
      cfe8f80e-e4b6-4eb7-be65-56edd02f7db1-image.png

      Aktualisiert werden die Daten bei einem refresh im Browser. Ich hätte das aber gerne bei Änderung der relevanten Datenpunkte ohne refresh... und das will nicht!
      Wie muss ich die Trigger im Spoiler an den Adapter übergeben?

      //Trigger für update des Charts
      on({id: [
       "alias.0.1000_Heizung.WP.VLTemperatur",
       "alias.0.1000_Heizung.Klima.AussenTemperatur",
       "0_userdata.0.1000_Heizung.WP.COP"
      ], change: "any"}, function (obj) {
         const numVLact = getState("alias.0.1000_Heizung.WP.VLTemperatur").val;
         const numATact = getState("alias.0.1000_Heizung.Klima.AussenTemperatur").val;
         const numCOPact = getState("0_userdata.0.1000_Heizung.WP.COP").val;
      
         const update = {
             series: [
                 { name: "real", data: [[numATact, numVLact, numCOPact]] }/*,
                 { name: "Projektion auf AT-Ebene", data: [[numATact, 20, numCOPact]] },
                 { name: "Projektion auf VL-Ebene", data: [[numATact, numVLact, 0]] }*/
             ]
         };
         sendTo("flexcharts.0", "setOption", {
             id: "chartCOP",                  // Chart-ID im Frontend
             option: update,                  // Update-Objekt
             notMerge: false,
             lazyUpdate: false,
             transition: { duration: 800 }
         });
      })
      
      

      Vorab schon mal danke für die Hilfe

      posted in Tester
      U
      UlliJ
    • RE: Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?

      @obstbauer sagte in Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?:

      ystem.IO.InvalidDataException: timeout

      ... da bin ich raus.
      Ich habe eine x64 Installation und der Dienst läuft in einem LXC mit (derzeit noch) Debian 12, auf der nichts anderes installiert ist.
      Du könntest die issues auf Github https://github.com/zivillian/ism7mqtt durchsehen.

      Quick and dirty: den Dienst mit einem automatischen Neustart versehen
      Dazu in der Datei "ism7mqtt.service" die beiden Zeilen mit "Restart =..." einfügen

      [Unit]
      Description=ism7mqtt
      
      [Service]
      Type=simple
      ExecStart=/bin/bash /opt/ism7mqtt/ism7mqtt_start.sh
      Restart=always
      RestartSec=5s
      
      [Install]
      WantedBy=multi-user.target
      Alias=ism7mqtt.service
      

      Danach den Dienst neu laden oder den Rechner neu booten... wie gesagt keine saubere Lösung.
      Den restart habe ich auch aktiv, weil der Dienst offline geht und bleibt wenn die Gegenseite (mqtt broker) mal weg ist.

      posted in Einbindung von Geräten
      U
      UlliJ
    • RE: Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?

      @obstbauer sagte in Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?:

      woran könnte das nun liegen ?

      da werde ich Dir nicht viel helfen können...leider. Verstehe die Meldung aber so, daß irgendetwas in einen timeout läuft und anschließend der Dienst beendet wird. Ist das die komplette Fehlermeldung?

      Ist das ISM7 per Kabel oder Wlan angebunden? Wenn per Wlan ist das der erste Kandidat

      Auf der Konsole mal schauen was im log steht

      sudo journalctl -u ism7mqtt.service
      

      das log von hinten und seit dem letzten booten ...

      sudo journalctl -u ism7mqtt.service -b -e
      
      posted in Einbindung von Geräten
      U
      UlliJ
    • RE: Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?

      @obstbauer
      dann ist doch alles prima, viel Spaß damit👍

      die ganzen Dinge stehen schon lesbar im readme auf Github. Ich habe die parameter.json in das Verzeichnis von /ism7mqtt verschoben, daher ist der Pfad für die Datei hinfällig, steht auch da… gut heiz

      posted in Einbindung von Geräten
      U
      UlliJ
    • RE: Wolf WP CHA-10 - iSME7i (Wolf Link) oder iSME8i besser ?

      @obstbauer
      Sorry für das fehlende "e", war ein Tippfehler in meinen Notizen

      Schritt für Schritt erst mal die Konfiguration. Ohne die parameter.json wird das nichts
      Der Aufruf für "ism7config" braucht schon ein paar Parameter mehr als nur das -t. Die HIlfe sagt

      iob@WolfMqtt:/opt/ism7mqtt/makeconfig$ /opt/ism7mqtt/makeconfig/ism7config -h
        -i, --ipAddress=VALUE      Wolf Hostname or IP address
        -p, --password=VALUE       Wolf password
        -t, --target=VALUE         Target filename - defaults to parameter.json
        -h, --help                 show help
      

      Du musst mindestens die IP-Adresse und das Passwort vom ISM7 mitgeben. Versuch mal

      /opt/ism7mqtt/makeconfig/ism7config -i xxx.xxx.xxx.xxx -p DeinISM7Passwort
      

      Wenn die parameter.json dann etwa so aussieht hat es geklappt

      {
        "Devices": [
          {
            "ReadBusAddress": "0x00",
            "WriteBusAddress": "0x00",
            "DeviceTemplateId": 190000,
            "Parameter": [
              190000,
              190001,
              190002,
              190003,
              190004,
              190007,
              190011,
              190012,
              190014,
              190015,
              190016,
              190019,
              190020,
              190021
            ]
          },
          {
            "ReadBusAddress": "0x35",
            "WriteBusAddress": "0x30",
            "DeviceTemplateId": 220000,
            "Parameter": [
              220001,
              220021,
              220022,
              220023,
              220025,
              220026,
              220027,
              220028,
              220029,
              220030,
      etc...
      
      posted in Einbindung von Geräten
      U
      UlliJ
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo