Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Neuer Adapter für UniPi Board - Websocket

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Neuer Adapter für UniPi Board - Websocket

Geplant Angeheftet Gesperrt Verschoben Entwicklung
13 Beiträge 6 Kommentatoren 3.6k Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Offline
    T Offline
    TOBO
    schrieb am zuletzt editiert von
    #1

    Ein Gruss and die Expterten :-)

    Ich hatte hier schon mal eine Thread eröffnet und gefragt ob jemand das UniPi Board kennt und es schon mal in IOBroker verwendet hat.

    http://forum.iobroker.net/viewtopic.php?f=20&t=5572

    So wie ich es sehe, wohl eher nicht. Eigentlich ist es für mich eine Überraschung das wohl keiner das Board kennt. Als ich vor ca. einem Jahr meinen ersten Raspberry gekauft und nach I/O Boards gesucht habe, bin ich sehr schnell auf dieses Teil gestoßen.

    https://www.unipi.technology/products/unipi-1-1-19

    Das Board hat:

    8 × changeover relays (rated 250V AC/5A or 24V DC/5A)

    14 × opto-isolated digital inputs (triggered by 5-24V DC)

    2 × 0-10 V analogue inputs

    1 × 0-10 V analogue output

    1 × 1-Wire port (suitable for connection of for example digital 1-Wire thermometers or other 1-Wire sensors)

    1 × I2C port for extension

    1 × Battery slot for RTC (Real Time Clock)

    1 × UART port for external serial communications (it is possible to connect directly via serial adapter)

    Also ist ziemlich multifunktional. Im Prinzip ein idealer Einstieg.

    Es gibt dafür eine Websocket API namens EVOK.

    https://github.com/UniPiTechnology/evok

    Nun, ich bin leider ein absoluter Laie was Java angeht und sehe keinerlei Möglichkeit für das Board selbst einen Adapter für IOBroker zu erstellen.

    Jetzt habe ich die Hoffnung hier jemanden zu finden, der die Herausforderung annimmt und sich der Sache antut.

    Ich habe ein Board und würde es zur Verfügung stellen, wenn ich es denn wiederbekomme.

    Soweit ich das als DAU beurteilen kann, ist der Befehlssatz relativ einfach. Die E/A Struktur ist fest vorgeben. Zumindest für die digitalen und analogen E/A's.

    HTTP POST
    
    Simple example using wget to get status of devices:
    
        wget -qO- http://your.pi.ip.address/rest/all returns status of all devices configured in evok.conf
        wget -qO- http://your.pi.ip.address/rest/relay/1 returns status of relay with circuit nr. 1
        wget -qO- http://your.pi.ip.address/rest/relay/1/value returns whether the relay 1 is on or of (1/0)
        wget -qO- http://your.pi.ip.address/rest/ao/1/value returns the value of analog output
        wget -qO- http://your.pi.ip.address/rest/ai/1/value returns the value of analog input
    
    To control a device, all requests must be sent by HTTP POST. Here is a small example of controlling a relay:
    
        wget -qO- http://your.pi.ip.address/rest/relay/3 --post-data='value=1' sets relay on
        wget -qO- http://your.pi.ip.address/rest/relay/3 --post-data='value=0' sets relay off
        wget -qO- http://your.pi.ip.address/rest/ao/1 --post-data='value=5' set AO to 5V
    
    

    Ich hoffe es gibt da draußen einen, der sich meiner erbarmt. Kann mir auch sehr gut vorstellen, dass es andere gibt, die diese Board verwenden würden.

    150,- Euros für so eine Menge an E/A's und Schnittstellen ist meiner Meinung nach nicht zu viel.

    Beste Grüße aus Shanghai.

    Thorsten

    PS: Ich hatte sowieso vor nach Installation meines neues Hauses in DE eine Spende an IOBroker zu machen. Vergleichbare kommerzielle Software kostet doch einiges. Ich teste IOBroker nun seit ca. drei Tagen und bin begeistert. S7 Kommunikation funktioniert super. Mit der VIS komme ich auch schon klar und ich sehe da ungeahnte Lösungen für mein neues zu Hause. Also ich möchte das nicht alles für Lau abgreifen. das was hier geleistet wurde ist schon beachtlich.

    J 1 Antwort Letzte Antwort
    0
    • apollon77A Online
      apollon77A Online
      apollon77
      schrieb am zuletzt editiert von
      #2

      Ich habs mal ins Trello gepackt als Idea/Request …

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • apollon77A Online
        apollon77A Online
        apollon77
        schrieb am zuletzt editiert von
        #3

        Bzw zum lesen kannst DU mal den "parser"-Adapter versuchen … das sollte gehen. Schreiben kann der aber (noch) nicht

        Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

        • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
        • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
        1 Antwort Letzte Antwort
        0
        • T Offline
          T Offline
          TOBO
          schrieb am zuletzt editiert von
          #4

          Sorry, aber ich verstehe kein Wort.

          1 Antwort Letzte Antwort
          0
          • Y Offline
            Y Offline
            ykuendig
            schrieb am zuletzt editiert von
            #5

            Es gibt einen Adapter mit Namen "parser". Der kann URLs aufrufen und die Antwort auswerten. Damit könntest Du die wget's nachbilden und die Relais-Stati visualisieren.

            Schreiben kann der Adapter aber noch nicht - sprich: um die Relais umzusteuern müsste man mit JavaScript ran.

            Obwohl geplant ist den Adapter in dieser Hinsicht zu erweitern, kann das noch etwas dauern.

            Gruss Yves

            1 Antwort Letzte Antwort
            0
            • T Offline
              T Offline
              TOBO
              schrieb am zuletzt editiert von
              #6

              Das hört sich doch sehr kompliziert an und ist ja auch noch keine Lösung.

              Es hat wohl keiner ein richtiges Interesse daran so einen Adapter zu schreiben.

              Liegt es daran das es doch sehr viel komplizierter ist als ich mir vorstelle, oder das Board nicht interessant ist ?

              1 Antwort Letzte Antwort
              0
              • Y Offline
                Y Offline
                ykuendig
                schrieb am zuletzt editiert von
                #7

                Tja, die Wahrheit ist manchmal nicht schwarz oder weiss.

                Ich kann nicht - Mangelhafte Programmierkenntnisse.

                Du kannst auch nicht - Kenntnisse.

                Apollon hat genug Arbeit damit die bestehenden Adapter von Fehlern zu bereinigen.

                Sonst ist zur Zeit keiner da im Gespräch.

                Das Board ist wahrscheinlich nicht schlecht (obwohl, das müsstest Du besser wissen als ich). Scheinbar noch nicht so verbreitet.

                Zudem hört sich das steuern über JavaScript komplizierter an als Du befürchtest. Wenn Du das probieren willst, bin ich sicher das wir da Leute finden die beim Scripten helfen. Aber ein Script in ein Adapter zu wandeln, das ist doch noch ein Unterschied.

                Wer weiss schon, plötzlich tut sich was.

                Gruss Yves

                1 Antwort Letzte Antwort
                0
                • VumerV Offline
                  VumerV Offline
                  Vumer
                  schrieb am zuletzt editiert von
                  #8

                  @TOBO:

                  Es gibt dafür eine Websocket API namens EVOK.

                  https://github.com/UniPiTechnology/evok

                  Nun, ich bin leider ein absoluter Laie was Java angeht und sehe keinerlei Möglichkeit für das Board selbst einen Adapter für IOBroker zu erstellen. `
                  hab versucht dem https://github.com/mwittig/pimatic-unipi-evok zu installieren, Ergebnis natürlich mit error :roll:

                  1 Antwort Letzte Antwort
                  0
                  • T Offline
                    T Offline
                    TOBO
                    schrieb am zuletzt editiert von
                    #9

                    Wenn Du es zum laufen bekommst, bitte melden.

                    1 Antwort Letzte Antwort
                    0
                    • VumerV Offline
                      VumerV Offline
                      Vumer
                      schrieb am zuletzt editiert von
                      #10

                      Wenn ich wüsste wie :shock:

                      1 Antwort Letzte Antwort
                      0
                      • apollon77A Online
                        apollon77A Online
                        apollon77
                        schrieb am zuletzt editiert von
                        #11

                        An alle Interessierten: Adapter-Request ist jetzt auf Github unter https://github.com/ioBroker/AdapterRequests/issues/29 zu finden. Bitte dort wie unter https://github.com/ioBroker/AdapterRequ … o-use-this beschrieben voten!

                        Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                        • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                        • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                        1 Antwort Letzte Antwort
                        0
                        • T TOBO

                          Ein Gruss and die Expterten :-)

                          Ich hatte hier schon mal eine Thread eröffnet und gefragt ob jemand das UniPi Board kennt und es schon mal in IOBroker verwendet hat.

                          http://forum.iobroker.net/viewtopic.php?f=20&t=5572

                          So wie ich es sehe, wohl eher nicht. Eigentlich ist es für mich eine Überraschung das wohl keiner das Board kennt. Als ich vor ca. einem Jahr meinen ersten Raspberry gekauft und nach I/O Boards gesucht habe, bin ich sehr schnell auf dieses Teil gestoßen.

                          https://www.unipi.technology/products/unipi-1-1-19

                          Das Board hat:

                          8 × changeover relays (rated 250V AC/5A or 24V DC/5A)

                          14 × opto-isolated digital inputs (triggered by 5-24V DC)

                          2 × 0-10 V analogue inputs

                          1 × 0-10 V analogue output

                          1 × 1-Wire port (suitable for connection of for example digital 1-Wire thermometers or other 1-Wire sensors)

                          1 × I2C port for extension

                          1 × Battery slot for RTC (Real Time Clock)

                          1 × UART port for external serial communications (it is possible to connect directly via serial adapter)

                          Also ist ziemlich multifunktional. Im Prinzip ein idealer Einstieg.

                          Es gibt dafür eine Websocket API namens EVOK.

                          https://github.com/UniPiTechnology/evok

                          Nun, ich bin leider ein absoluter Laie was Java angeht und sehe keinerlei Möglichkeit für das Board selbst einen Adapter für IOBroker zu erstellen.

                          Jetzt habe ich die Hoffnung hier jemanden zu finden, der die Herausforderung annimmt und sich der Sache antut.

                          Ich habe ein Board und würde es zur Verfügung stellen, wenn ich es denn wiederbekomme.

                          Soweit ich das als DAU beurteilen kann, ist der Befehlssatz relativ einfach. Die E/A Struktur ist fest vorgeben. Zumindest für die digitalen und analogen E/A's.

                          HTTP POST
                          
                          Simple example using wget to get status of devices:
                          
                              wget -qO- http://your.pi.ip.address/rest/all returns status of all devices configured in evok.conf
                              wget -qO- http://your.pi.ip.address/rest/relay/1 returns status of relay with circuit nr. 1
                              wget -qO- http://your.pi.ip.address/rest/relay/1/value returns whether the relay 1 is on or of (1/0)
                              wget -qO- http://your.pi.ip.address/rest/ao/1/value returns the value of analog output
                              wget -qO- http://your.pi.ip.address/rest/ai/1/value returns the value of analog input
                          
                          To control a device, all requests must be sent by HTTP POST. Here is a small example of controlling a relay:
                          
                              wget -qO- http://your.pi.ip.address/rest/relay/3 --post-data='value=1' sets relay on
                              wget -qO- http://your.pi.ip.address/rest/relay/3 --post-data='value=0' sets relay off
                              wget -qO- http://your.pi.ip.address/rest/ao/1 --post-data='value=5' set AO to 5V
                          
                          

                          Ich hoffe es gibt da draußen einen, der sich meiner erbarmt. Kann mir auch sehr gut vorstellen, dass es andere gibt, die diese Board verwenden würden.

                          150,- Euros für so eine Menge an E/A's und Schnittstellen ist meiner Meinung nach nicht zu viel.

                          Beste Grüße aus Shanghai.

                          Thorsten

                          PS: Ich hatte sowieso vor nach Installation meines neues Hauses in DE eine Spende an IOBroker zu machen. Vergleichbare kommerzielle Software kostet doch einiges. Ich teste IOBroker nun seit ca. drei Tagen und bin begeistert. S7 Kommunikation funktioniert super. Mit der VIS komme ich auch schon klar und ich sehe da ungeahnte Lösungen für mein neues zu Hause. Also ich möchte das nicht alles für Lau abgreifen. das was hier geleistet wurde ist schon beachtlich.

                          J Offline
                          J Offline
                          JR-Home
                          schrieb am zuletzt editiert von JR-Home
                          #12

                          @TOBO Das Unipi 1.1 Board finde ich wirklich klasse. Schade dass es dafür noch keinen fertigen Adapter gibt. Preis Leistungs/Verhältnis einfach unschlagbar.
                          Da ich noch nicht weiß wie man einen Adapter schreibt, habe ich dennoch ein Java Script erstellt, mit dem man über das EVOK Interface die Relais und Eingänge wie gewohnt ansprechen kann. Für jeden Ein/Ausgang wird dabei ein Objekt angelegt. Wer kann daraus einen Adapter basteln?

                          console.log("Starte UniPi 1.1 EVOK Interface V1.0."); 
                          
                          const csUnipi = "http://localhost:9599/rest/";
                          const csUnipiObjectPath ="javascript.0.UniPi."
                          var aOneWireIDs = {};
                          
                          // Liste der erwarteten OneWire IDs mit dem dazugehörenden IOBroker Objekt. Diese können über
                          // das Unipi Control Panal mit http://Raspi-IP:UnipiEvokPort ermittelt werden.
                          // Diese Tabelle stellt sicher, dass unter der ID immer derselbe Sensor gefunden wird, und sich
                          // die Reihenfolge und Zugriff auf einen spezifischen Sensor auch bei Ausfall eines anderen Sensors 
                          // nicht ändert!
                          aOneWireIDs["28FF6419D5853EB0"] = csUnipiObjectPath + "Input.OneWire1.";
                          aOneWireIDs["xyz"] = csUnipiObjectPath + "Input.OneWire2.";
                          
                          // Das Objekt das den Relais Status representiert anlegen
                          // true wenn bereits vorhanden überschreiben, false nur falls nicht vorhanden anlegen
                          createState( csUnipiObjectPath + "Status", 0, false, {name: 'Unipi Status', type: 'string', unit: 'Info'});
                          var i;
                          for (i = 1; i <= 8; i++) {
                              createState( csUnipiObjectPath + "Relay.R" + i, 0, false, {name: 'Unipi Rel ' + i, type: 'number', min: 0, max: 1, unit: ''});
                          }
                          for (i = 1; i <= 12; i++) {
                              createState( csUnipiObjectPath + "Input.I" + String( i ).padStart(2, '0'), 0, false, {name: 'Unipi Inp ' + i, type: 'number', min: 0, max: 1, unit: ''});
                          }
                          
                          createState( csUnipiObjectPath + "Input.AI1", 0, false, {name: 'Unipi AInp 1', unit: ''});
                          createState( csUnipiObjectPath + "Input.AI2", 0, false, {name: 'Unipi AInp 2', unit: ''});
                          
                          function AddOneWireObject( sOneWireAddress, sIOBrokerObjectPath )
                          {
                          //    console.log( `Adding OneWire Object: ${sIOBrokerObjectPath} Device ID: ${sOneWireAddress}` );
                              createState( sIOBrokerObjectPath + "value", 0, false, {name: 'Unipi One Wire value', unit: '°C'});
                              createState( sIOBrokerObjectPath + "typ", "not connected", false, {name: 'Unipi One Wire sensor type', unit: ''});
                              createState( sIOBrokerObjectPath + "address", sOneWireAddress, false, {name: 'Unipi One Wire adress', unit: ''});
                          };
                          
                          // Und die Datenpunkte für die OneWire Sensoren anlegen
                          for (var key in aOneWireIDs ) {
                              // OneWireIDs.forEach( function(key, value) {
                              AddOneWireObject( key, aOneWireIDs[key] );
                          };
                          
                          var request = require( "request" );
                          
                          function ReadUnipiInputs()
                          {
                              // Status aller Komponenten auslesen
                              request( csUnipi + "all", function (error, response, body) {
                                  if( error != null )
                                  {
                                      console.error( "Error accessing Unipi Evok: " + error );
                                      setState( csUnipiObjectPath + "Status", "Last Error: " + error, true ); 
                                  }
                                  else
                                  {
                                      setState( csUnipiObjectPath + "Status", "Available", true ); 
                                      var json = JSON.parse(body);
                                      // console.log ( "JSON: " + JSON.stringify(json) );
                                      json.forEach( oUnipi => {
                                          if( oUnipi.dev == "input" ) // && obj.circuit == "4")
                                          {
                                              // ACK=True, da Wert von "Hardware" geändert
                                              // String( oUnipi.circuit ).padStart(2, '0') liefert die Input Nummer mit einer führenden Null
                                              setState( csUnipiObjectPath + "Input.I" + String( oUnipi.circuit ).padStart(2, '0'), oUnipi.value, true ); 
                                              // console.log( "Input " + obj.circuit + ":" + obj.value )
                                              // Object.entries(obj).forEach(([key, value]) => {
                                              // console.log(`${key} ${value}`);
                                              // });
                                          }
                                          if( oUnipi.dev == "ai" )
                                          {
                                              // Tatsächlicher Wert der Hardware gelesen, daher ACK=TRUE
                                              setState( csUnipiObjectPath + "Input.AI" + oUnipi.circuit, oUnipi.value, true ); 
                                              //console.log( "Analog Input " + obj.circuit + ":" + obj.value )
                                          }
                                          // Falls sich der Zustand der Relais geändert hat (z. B. andere Zugriffe direkt auf EVOK) 
                                          // dann diesen auch übernehmen
                                          // Auch falls Ack noch nicht gesetzt sein sollte, "Wertübernahme durch HW" bestätigen
                                          if( oUnipi.dev == "relay")
                                          {
                                              var oRel = getState( csUnipiObjectPath + "Relay.R" + oUnipi.circuit );
                                              // Den Wert übernehmen wir aber nur mit Verzögerung, um zu verhindern, dass wir der asynchronen 
                                              // Bearbeitung der "On" Event Funktion dazwischenfunken.
                                              if( ( Number( oRel.val ) != oUnipi.value || oRel.ack != true ) && Date.now() - oRel.lc > 2000 )
                                              {
                                                  // console.log( "TimeDiff: " + ( Date.now() - oRel.lc ) );
                                                  // Tatsächlicher Wert der Hardware gelesen, daher ACK=TRUE
                                                  setState( csUnipiObjectPath + "Relay.R" + oUnipi.circuit, oUnipi.value, true );
                                              }
                                          }
                                          // Typ ist gesetzt bei den 1 Wire devices
                                          if( oUnipi.typ > "" )
                                          {
                                              // Die I/O Broker Objekt ID ermitteln
                                              var sOneWireObject = aOneWireIDs[ oUnipi.address ];
                                              if( sOneWireObject > "" )
                                              {
                                                  setState( sOneWireObject + "value", oUnipi.value, true );
                                                  if( getState( sOneWireObject + "typ" ).val != oUnipi.typ )
                                                  {
                                                      setState( sOneWireObject + "typ", oUnipi.typ, true );
                                                  }
                                                  // Wird schon beim anlegen des Objektes gesetzt...
                                                  // setState( OneWireObject + "address", oUnipi.address, true );
                                              }
                                              else
                                              {
                                                  var iLength = Object.keys( aOneWireIDs ).length + 1;    // aOneWire.length funktioniert bei einem assoziativen Array nicht....
                                                  console.error( "Error unknown One Wire device found. Please add new Datapoint: " + oUnipi.address + ". Temporary added as ID: " + iLength );
                                                  aOneWireIDs[oUnipi.address] = csUnipiObjectPath + "Input.OneWire_temp" + iLength + ".";
                                                  AddOneWireObject( oUnipi.address, aOneWireIDs[oUnipi.address] );
                                              }    
                                          }
                                      }); 
                                  }
                              });
                          }
                          
                          schedule("*/1 * * * * *", function () { // Abfrage alle 1 Sec
                              ReadUnipiInputs(); 
                          });
                          
                          function WriteOutput( obj )
                          {
                              var RelNum = obj.id.substring(obj.id.length - 1);
                          //    console.log( "Rel " + RelNum + " ObjID: " + obj.id + " Val: " + Number( obj.state.val ) + " Ack: " + obj.state.ack );
                              // Nur falls der Wert nicht bereits von der Hardware bestätigt wurde übernehmen.
                              if( obj.state.ack == false )
                              {
                                  // Mit Number() wird das Objekt auch bei true/false in eine Zahl umgewandelt.
                                  request.post( csUnipi + "relay/" + RelNum, {form:{ value:Number( obj.state.val ) }}, function (error, response, body){
                                      if( error == null )
                                      {
                                          // Schreiben auf die HW war erfolgreich, damit mit Ack=true bestätigen.
                                          setState( obj.id, Number( obj.state.val ), true );
                                      }
                                      else
                                      {
                                          console.error( "Error accessing Unipi Evok: " + error );
                                      }
                                  });
                              }
                          }
                          
                          // Damit nicht der On-Event für jedes Relais einzeln gesetzt werden muss 8x mit
                          // on({id: csUnipiObjectPath + "Relay.R1", change: 'ne'}, function (obj) {
                          // eine RegExpr. anlegen. Zu beachten: im String den \\ verdoppeln!
                          // \d beliebige Zahl
                          var RelObjectPath = csUnipiObjectPath + "Relay.R\\d";
                          on({id: new RegExp( RelObjectPath.replace(".", "\\.") ), change: 'ne'}, function (obj) {
                              WriteOutput( obj );
                          });
                          

                          MOD-Edit: Code in code-tags gesetzt!

                          P 1 Antwort Letzte Antwort
                          0
                          • J JR-Home

                            @TOBO Das Unipi 1.1 Board finde ich wirklich klasse. Schade dass es dafür noch keinen fertigen Adapter gibt. Preis Leistungs/Verhältnis einfach unschlagbar.
                            Da ich noch nicht weiß wie man einen Adapter schreibt, habe ich dennoch ein Java Script erstellt, mit dem man über das EVOK Interface die Relais und Eingänge wie gewohnt ansprechen kann. Für jeden Ein/Ausgang wird dabei ein Objekt angelegt. Wer kann daraus einen Adapter basteln?

                            console.log("Starte UniPi 1.1 EVOK Interface V1.0."); 
                            
                            const csUnipi = "http://localhost:9599/rest/";
                            const csUnipiObjectPath ="javascript.0.UniPi."
                            var aOneWireIDs = {};
                            
                            // Liste der erwarteten OneWire IDs mit dem dazugehörenden IOBroker Objekt. Diese können über
                            // das Unipi Control Panal mit http://Raspi-IP:UnipiEvokPort ermittelt werden.
                            // Diese Tabelle stellt sicher, dass unter der ID immer derselbe Sensor gefunden wird, und sich
                            // die Reihenfolge und Zugriff auf einen spezifischen Sensor auch bei Ausfall eines anderen Sensors 
                            // nicht ändert!
                            aOneWireIDs["28FF6419D5853EB0"] = csUnipiObjectPath + "Input.OneWire1.";
                            aOneWireIDs["xyz"] = csUnipiObjectPath + "Input.OneWire2.";
                            
                            // Das Objekt das den Relais Status representiert anlegen
                            // true wenn bereits vorhanden überschreiben, false nur falls nicht vorhanden anlegen
                            createState( csUnipiObjectPath + "Status", 0, false, {name: 'Unipi Status', type: 'string', unit: 'Info'});
                            var i;
                            for (i = 1; i <= 8; i++) {
                                createState( csUnipiObjectPath + "Relay.R" + i, 0, false, {name: 'Unipi Rel ' + i, type: 'number', min: 0, max: 1, unit: ''});
                            }
                            for (i = 1; i <= 12; i++) {
                                createState( csUnipiObjectPath + "Input.I" + String( i ).padStart(2, '0'), 0, false, {name: 'Unipi Inp ' + i, type: 'number', min: 0, max: 1, unit: ''});
                            }
                            
                            createState( csUnipiObjectPath + "Input.AI1", 0, false, {name: 'Unipi AInp 1', unit: ''});
                            createState( csUnipiObjectPath + "Input.AI2", 0, false, {name: 'Unipi AInp 2', unit: ''});
                            
                            function AddOneWireObject( sOneWireAddress, sIOBrokerObjectPath )
                            {
                            //    console.log( `Adding OneWire Object: ${sIOBrokerObjectPath} Device ID: ${sOneWireAddress}` );
                                createState( sIOBrokerObjectPath + "value", 0, false, {name: 'Unipi One Wire value', unit: '°C'});
                                createState( sIOBrokerObjectPath + "typ", "not connected", false, {name: 'Unipi One Wire sensor type', unit: ''});
                                createState( sIOBrokerObjectPath + "address", sOneWireAddress, false, {name: 'Unipi One Wire adress', unit: ''});
                            };
                            
                            // Und die Datenpunkte für die OneWire Sensoren anlegen
                            for (var key in aOneWireIDs ) {
                                // OneWireIDs.forEach( function(key, value) {
                                AddOneWireObject( key, aOneWireIDs[key] );
                            };
                            
                            var request = require( "request" );
                            
                            function ReadUnipiInputs()
                            {
                                // Status aller Komponenten auslesen
                                request( csUnipi + "all", function (error, response, body) {
                                    if( error != null )
                                    {
                                        console.error( "Error accessing Unipi Evok: " + error );
                                        setState( csUnipiObjectPath + "Status", "Last Error: " + error, true ); 
                                    }
                                    else
                                    {
                                        setState( csUnipiObjectPath + "Status", "Available", true ); 
                                        var json = JSON.parse(body);
                                        // console.log ( "JSON: " + JSON.stringify(json) );
                                        json.forEach( oUnipi => {
                                            if( oUnipi.dev == "input" ) // && obj.circuit == "4")
                                            {
                                                // ACK=True, da Wert von "Hardware" geändert
                                                // String( oUnipi.circuit ).padStart(2, '0') liefert die Input Nummer mit einer führenden Null
                                                setState( csUnipiObjectPath + "Input.I" + String( oUnipi.circuit ).padStart(2, '0'), oUnipi.value, true ); 
                                                // console.log( "Input " + obj.circuit + ":" + obj.value )
                                                // Object.entries(obj).forEach(([key, value]) => {
                                                // console.log(`${key} ${value}`);
                                                // });
                                            }
                                            if( oUnipi.dev == "ai" )
                                            {
                                                // Tatsächlicher Wert der Hardware gelesen, daher ACK=TRUE
                                                setState( csUnipiObjectPath + "Input.AI" + oUnipi.circuit, oUnipi.value, true ); 
                                                //console.log( "Analog Input " + obj.circuit + ":" + obj.value )
                                            }
                                            // Falls sich der Zustand der Relais geändert hat (z. B. andere Zugriffe direkt auf EVOK) 
                                            // dann diesen auch übernehmen
                                            // Auch falls Ack noch nicht gesetzt sein sollte, "Wertübernahme durch HW" bestätigen
                                            if( oUnipi.dev == "relay")
                                            {
                                                var oRel = getState( csUnipiObjectPath + "Relay.R" + oUnipi.circuit );
                                                // Den Wert übernehmen wir aber nur mit Verzögerung, um zu verhindern, dass wir der asynchronen 
                                                // Bearbeitung der "On" Event Funktion dazwischenfunken.
                                                if( ( Number( oRel.val ) != oUnipi.value || oRel.ack != true ) && Date.now() - oRel.lc > 2000 )
                                                {
                                                    // console.log( "TimeDiff: " + ( Date.now() - oRel.lc ) );
                                                    // Tatsächlicher Wert der Hardware gelesen, daher ACK=TRUE
                                                    setState( csUnipiObjectPath + "Relay.R" + oUnipi.circuit, oUnipi.value, true );
                                                }
                                            }
                                            // Typ ist gesetzt bei den 1 Wire devices
                                            if( oUnipi.typ > "" )
                                            {
                                                // Die I/O Broker Objekt ID ermitteln
                                                var sOneWireObject = aOneWireIDs[ oUnipi.address ];
                                                if( sOneWireObject > "" )
                                                {
                                                    setState( sOneWireObject + "value", oUnipi.value, true );
                                                    if( getState( sOneWireObject + "typ" ).val != oUnipi.typ )
                                                    {
                                                        setState( sOneWireObject + "typ", oUnipi.typ, true );
                                                    }
                                                    // Wird schon beim anlegen des Objektes gesetzt...
                                                    // setState( OneWireObject + "address", oUnipi.address, true );
                                                }
                                                else
                                                {
                                                    var iLength = Object.keys( aOneWireIDs ).length + 1;    // aOneWire.length funktioniert bei einem assoziativen Array nicht....
                                                    console.error( "Error unknown One Wire device found. Please add new Datapoint: " + oUnipi.address + ". Temporary added as ID: " + iLength );
                                                    aOneWireIDs[oUnipi.address] = csUnipiObjectPath + "Input.OneWire_temp" + iLength + ".";
                                                    AddOneWireObject( oUnipi.address, aOneWireIDs[oUnipi.address] );
                                                }    
                                            }
                                        }); 
                                    }
                                });
                            }
                            
                            schedule("*/1 * * * * *", function () { // Abfrage alle 1 Sec
                                ReadUnipiInputs(); 
                            });
                            
                            function WriteOutput( obj )
                            {
                                var RelNum = obj.id.substring(obj.id.length - 1);
                            //    console.log( "Rel " + RelNum + " ObjID: " + obj.id + " Val: " + Number( obj.state.val ) + " Ack: " + obj.state.ack );
                                // Nur falls der Wert nicht bereits von der Hardware bestätigt wurde übernehmen.
                                if( obj.state.ack == false )
                                {
                                    // Mit Number() wird das Objekt auch bei true/false in eine Zahl umgewandelt.
                                    request.post( csUnipi + "relay/" + RelNum, {form:{ value:Number( obj.state.val ) }}, function (error, response, body){
                                        if( error == null )
                                        {
                                            // Schreiben auf die HW war erfolgreich, damit mit Ack=true bestätigen.
                                            setState( obj.id, Number( obj.state.val ), true );
                                        }
                                        else
                                        {
                                            console.error( "Error accessing Unipi Evok: " + error );
                                        }
                                    });
                                }
                            }
                            
                            // Damit nicht der On-Event für jedes Relais einzeln gesetzt werden muss 8x mit
                            // on({id: csUnipiObjectPath + "Relay.R1", change: 'ne'}, function (obj) {
                            // eine RegExpr. anlegen. Zu beachten: im String den \\ verdoppeln!
                            // \d beliebige Zahl
                            var RelObjectPath = csUnipiObjectPath + "Relay.R\\d";
                            on({id: new RegExp( RelObjectPath.replace(".", "\\.") ), change: 'ne'}, function (obj) {
                                WriteOutput( obj );
                            });
                            

                            MOD-Edit: Code in code-tags gesetzt!

                            P Offline
                            P Offline
                            PEPITO82
                            schrieb am zuletzt editiert von
                            #13

                            @jr-home Ich finde es auch sehr schade, dass es keinen Adapter für das Unipi Board bzw. die Neurons gibt.

                            In FHEM gibt es z.B. das Modul hier: https://forum.fhem.de/index.php?topic=84746.0
                            Ist offiziell zwar für die Neurons, aber klappt auch mit dem Unipi 1.1 Board.

                            Bei der Adapter Entwicklung könnte ich ggf. mit Hardware unterstützen, da ich zu Hause ein zweites Board rumliegen habe.

                            1 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            506

                            Online

                            32.4k

                            Benutzer

                            81.4k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2025
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe