Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    W
    • Profile
    • Following 0
    • Followers 0
    • Topics 8
    • Posts 88
    • Best 6
    • Groups 1

    Worlik

    @Worlik

    Starter

    8
    Reputation
    13
    Profile views
    88
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Worlik Follow
    Starter

    Best posts made by Worlik

    • RE: [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Ich hätte da was für die Kategorie Shelly. Damit in Blockly-Skripten zum Beispiel bei einem Trigger für einen Schaltzustand nicht einfach nur "Switch" steht, sondern man direkt den Gerätenamen, Kanalnamen und den Namen des Eigenschaftswertes sieht, habe ich etwas geskriptet. Dieses Skript updated den Common-Name der einzelnen Knoten der Shellygeräte, so das man dann sehr schön sehen kann, was genau im Blockly Skript geschrieben oder gelesen wird.

      var shellies = $('shelly.0.*.name');
      
      var generalTemplate = {
          'factoryResetFromSwitch': 'Firmwareupdate via Schalter',
          'firmware': 'Firmware Update verfügbar',
          'firmwareupdate': 'Firmware Update auslösen',
          'hostname': 'Hostname',
          'id': 'Gerätetyp',
          'mode': 'Modus',
          'name': 'Gerätename',
          'online': 'Verfügbar',
          'overtemperature': 'Überhitzt',
          'protocol': 'verwendetes Protokoll',
          'reboot': 'Neustarten',
          'rssi': 'WLAN-Empfang',
          'temperatureC': 'Gerätetemperatur in °C',
          'temperatureF': 'Gerätetemperatur in °F',
          'type': 'Gerätetyp',
          'uptime': 'Onlinezeit',
          'version': 'Firmware Version',
          'ext': 'externe Sensoren',
          'ext.humidity1': 'Luftfeuchtigkeit 1',
          'ext.humidity2': 'Luftfeuchtigkeit 2',
          'ext.humidity3': 'Luftfeuchtigkeit 3',
          'ext.temperatureC1': 'Temperatur 1 in °C',
          'ext.temperatureC2': 'Temperatur 2 in °C',
          'ext.temperatureC3': 'Temperatur 3 in °C',
          'ext.temperatureF1': 'Temperatur 1 in °F',
          'ext.temperatureF2': 'Temperatur 2 in °F',
          'ext.temperatureF3': 'Temperatur 3 in °F',
          'Shutter': 'Jalousiesteuerung',
          'Shutter.ButtonReverse': 'Button umkehren',
          'Shutter.ButtonType': 'Button-Typ',
          'Shutter.Close': 'Schließen',
          'Shutter.Duration': 'Dauer',
          'Shutter.Energy': 'Zähler',
          'Shutter.Open': 'Öffnen',
          'Shutter.Pause': 'Pausieren',
          'Shutter.Position': 'Position',
          'Shutter.Power': 'Momentanverbrauch',
          'Shutter.StopReason': 'Stoppgrund',
          'Shutter.state': 'Status',
      }
      
      var dimmerTemplate = {
          'AutoTimerOff': 'Ausschalttimer',
          'AutoTimerOn': 'Einschalttimer',
          'ButtonType': 'Button-Typ',
          'ChannelName': 'Kanalname',
          'Energy': 'Zähler',
          'Event1': 'letztes Ereignis rechts',
          'Event2': 'letztes Ereignis links',
          'EventCount1': 'Anzahl Ereignisse rechts',
          'EventCount2': 'Anzahl Ereignisse links',
          'Input1': 'rechter Schalter gedrückt',
          'Input2': 'linker Schalter gedrückt',
          'Power': 'Momentanverbrauch',
          'Switch': 'Schaltzustand',
          'brightness': 'Helligkeit',
          'longpush1': 'rechts lang gedrückt',
          'longpush2': 'links lang gedrückt',
          'mode': 'Modus',
      }
      
      var relayTemplate = {
          'AutoTimerOff': 'Ausschalttimer',
          'AutoTimerOn': 'Einschalttimer',
          'ButtonReverse': 'Button umkehren',
          'ButtonType': 'Button-Typ',
          'ChannelName': 'Kanalname',
          'Name': 'Kanalname',
          'Energy': 'Zähler',
          'Event': 'letztes Ereignis',
          'EventCount': 'Anzahl Ereignisse',
          'Input': 'Schalter gedrückt',
          'Power': 'Momentanverbrauch',
          'Switch': 'Schaltzustand',
          'Timer': 'Timer',
          'longpush': 'lang gedrückt',
          'longpushtime': 'Dauer langes drücken',
      }
      
      var updateCount = 0;
      
      console.log('Dem System sind ' + shellies.length + ' Geräte von Shelly bekannt.');
      
      shellies.each(
          function(id, i) {
              var shellyId = id.split(".").slice(0,-1).join(".");
              var lightsChannelName = $(shellyId + '.lights.ChannelName');
              var relay0ChannelName = lightsChannelName.length == 0 ? $(shellyId + '.Relay0.ChannelName') : [];
              var relay1ChannelName = relay0ChannelName.length > 0 ? $(shellyId + '.Relay1.ChannelName') : [];
              var relay2ChannelName = relay1ChannelName.length > 0 ? $(shellyId + '.Relay2.ChannelName') : [];
              var deviceName = getState(id).val;
              var obj = null;
              var relays = [];
      
              // Fallback für den i3 (dieser nutzt nicht ChannelName, sondern Name für den Kanalnamen)
              if(lightsChannelName.length == 0 && relay0ChannelName.length == 0) {
                relay0ChannelName = lightsChannelName.length == 0 ? $(shellyId + '.Relay0.Name') : [];
                relay1ChannelName = relay0ChannelName.length > 0 ? $(shellyId + '.Relay1.Name') : [];
                relay2ChannelName = relay1ChannelName.length > 0 ? $(shellyId + '.Relay2.Name') : [];
              }
      
              for(const [key, value] of Object.entries(generalTemplate)) {
                  obj = getObject(shellyId + '.' + key);
      
                  if(obj && obj.common.name != (deviceName + ' ' + value).trim()) {
                      obj.common.name = (deviceName + ' ' + value).trim();
                      setObject(shellyId + '.' + key, obj);
                      updateCount++;
                  }
              }
      
              if(lightsChannelName.length > 0) {
                  var channelName = getState(lightsChannelName[0]).val;
      
                  if(channelName != deviceName)
                    channelName = deviceName + ' ' + channelName;
      
                  for(const [key, value] of Object.entries(dimmerTemplate)) {
                      obj = getObject(shellyId + '.lights.' + key);
      
                      if(obj && obj.common.name != (channelName + ' ' + value).trim()) {
                          obj.common.name = (channelName + ' ' + value).trim();
                          setObject(shellyId + '.lights.' + key, obj);
                          updateCount++;
                      }
                  }
              }
              
              if(relay0ChannelName.length > 0)
                  relays.push(getState(relay0ChannelName[0]).val);
      
              if(relay1ChannelName.length > 0)
                  relays.push(getState(relay1ChannelName[0]).val);
      
              if(relay2ChannelName.length > 0)
                  relays.push(getState(relay2ChannelName[0]).val);
      
              for(var i = 0; i < relays.length; i++) {
                  var channelName = relays[i];
      
                  if(channelName != deviceName)
                    channelName = deviceName + ' ' + channelName;
      
                  for(const [key, value] of Object.entries(relayTemplate)) {
                      obj = getObject(shellyId + '.Relay' + i + '.' + key);
      
                      if(obj && obj.common.name != (channelName + ' ' + value).trim()) {
                          obj.common.name = (channelName + ' ' + value).trim();
                          setObject(shellyId + '.Relay' + i + '.' + key, obj);
                          updateCount++;
                      }
                  }
              }
          }
      );
      
      console.log('Es wurden ' + updateCount + ' Objektnamen aktualisiert.');
      

      Ich hoffe meine Templates sind einigermaßen vollständig. Ich habe nur Shelly 1, Shelly 1PM, Shelly 2.5, Shelly Dimmer 2 und Shelly i3 hier zu Hause im Einsatz. Möglichweise werden weitere Templates benötigt oder die vorhandenen Templates oben im Skript müssen erweitert werden, um weitere Werte abzufragen.

      Das Skript kann einmal manuell gestartet werden, wenn man Shelly Geräte hinzugefügt oder umbenannt hat.

      Hier noch ein Beispiel in der Objekthierarchie:

      e230bd43-f96a-4b65-a24d-25e8c25cc2d6-image.png

      Und dann im Blockly Skript:

      ddd0f7cc-41f0-45c3-af09-6343c9aeb404-image.png

      posted in JavaScript
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @jogibear9988 Ja, absolut cool was du da geschaffen hast. Unheimlich mächtig. Ich habe händeringend nach einer Alternative für vis/vis2 gesucht. Deine webui kann so vieles besser. Das macht richtig Spaß damit etwas zu entwerfen. Ich liebe die CustomControls welche man sich zusammen bauen kann. Bitte unbedingt weiter machen. 🙂

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @smilie108 Bei formula muss für das Binding einfach das hier eingetragen werden:

      ~~__0

      Das rundet dir den Wert aus dem Binding. Die beiden ~~ sind dabei so üblich in JavaScript.

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      Hmm, eine Datumsauswahl im Webbrower ist bei einem Unixtimestamp jetzt doch aber eigentlich ziemlich simpel. Das kann jedes Standard input-Feld mit dem type="date" oder type="dateTime". Ich hatte das nur kurz ausprobiert, brauchte das aber für meine Visualisierung eigentlich gar nicht. Soweit ich weiß ging das relativ problemlos.

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @jogibear9988 Kann man eigentlich irgendwie die absolute Positionierung komplett abschalten? Ich baue gerade eine Responsive Design für Handy, Tablet und PC und es wäre einfach absolut genial, wenn man nicht jedes mal position: absolute und das andere Gedöns rausschmeißen kann. Grundsätzlich packt er ja beim Drag-Drop alles korrekt in den DOM, aber fügt eben immer die Position hinzu. Ich vermute fast, ich sehe nur irgendeinen Schalter nicht. Oder geht das tatsächlich nicht?

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @jogibear9988 Der Screenname sollte eine eindeutige ID bleiben

      posted in Visualisierung
      W
      Worlik

    Latest posts made by Worlik

    • RE: Wie kann ich den Streamer.bot Client in JS verwenden?

      @haus-automatisierung Vielen Dank.

      posted in JavaScript
      W
      Worlik
    • RE: Wie kann ich den Streamer.bot Client in JS verwenden?

      @mcu Okay, also sprich die von mir oben schon verlinkte Doku auf der offiziellen Webseite ist falsch:

      dae034b1-560a-429e-a9ac-bf3341a9ab4b-image.png

      Die Angabe:

      import { StreamerbotClient } from '@streamerbot/client';
      

      funktioniert übrigens auch in JavaScript so nicht.

      Das hier funktioniert als einziges und das habe ich keiner Doku gefunden:

      const { StreamerbotClient } = require('@streamerbot/client');
      

      Ich kenne mich mich node.js nicht aus und schreibe sonst immer Vanilla JavaScript oder verwende für Oberflächen Dinge wie jQuery. Also keine Ahnung, wo nun hier die genauen Zusammenhänge sind. Aber egal, habe ja nun eine funktionierende Lösung. Vielen Dank für die Hilfe. 😁

      posted in JavaScript
      W
      Worlik
    • RE: Wie kann ich den Streamer.bot Client in JS verwenden?

      @Thomas-Braun Der Websocket Server läuft auf einem anderen PC, deswegen ist der Port eigentlich egal.

      @MCU Interessant, so funktioniert es. Allerdings verstehe ich nicht, wann man die geschweiften Klammern braucht und wann nicht. Wie erkennt man das? Try and error? Beim WebSocket selbst sieht das ja zum Beispiel dann so aus:

      const WebSocketClient = require('websocket').client;
      

      Oder müsste das in der jeweiligen Doku stehen? Habe ich so leider nicht gefunden. 😒

      posted in JavaScript
      W
      Worlik
    • Wie kann ich den Streamer.bot Client in JS verwenden?

      Hallo,

      ich hatte hier die Frage zur Verwendung von einem generellen WebSocket zur Anbindung von OBS gestellt: WebSocket Client in einem Skript verwenden? - das funktioniert auch wunderbar. Nun ergibt sich für ein neues Projekt aber die Anbindung an Streamer.bot. Es gibt hier einen offiziellen Client, welchen man eigentlich via npm installieren können sollte, wenn ich dieser Doku folge.

      Ich habe ja nun schon verstanden, dass man das gewünschte npm Modul dem JavaScript Adapter bekannt machen muss und habe ihn entsprechend eingetragen und den Adapter neu gestartet:

      7839daee-5a6d-408e-a051-1832a37960c3-image.png

      Ich habe in Streamer.bot einen extra WebSocket Server gestartet und mit dem standard Websocket gelingt mir auch eine Verbindung. Ich habe eher das Problem, dass die Library irgendwie nicht so funktioniert wie ich mir das denke:

      let sbServerAddress = '192.168.0.38';
      let sbServerPort = '9090';
      const StreamerbotClient = require('@streamerbot/client');
      
      const client = new StreamerbotClient({
          host: sbServerAddress,
          port: sbServerPort,
          endpoint: '/'
      });
      

      Dabei bekomme ich diesen Fehler: TypeError: StreamerbotClient is not a constructor

      Wenn ich der oben verlinkten Anleitung folge, sollte das aber so funktionieren. Jemand eine Idee was ich da falsch mache? Oder liegt das an der Lib? Kann man da irgendwie noch besser sehen, wie genau der Fehler entsteht?

      posted in JavaScript
      W
      Worlik
    • RE: Test Elgato Key Light Adapter

      @mcm1957 Ja, mit der aktuellen js-controller Version läuft alles wieder. Habe damit nicht gerechnet, weil der Elgato Adapter nicht geändert wurde. Eventuell lag es auch am Neustart des Host-Controllers. Ich hatte ~20 Pakete hintereinander aktualisiert. Danke dir.

      posted in Tester
      W
      Worlik
    • RE: Test Elgato Key Light Adapter

      @mcm1957 Hey sorry. Du hast absolut recht. Ich hatte diesen Thread zufällig bei einer Lösungssuche gefunden und war mir wegen der letzten Einträge noch gar nicht sicher, ob das Modul noch gewartet wird. Asche auf mein Haupt. Der js-controller war auf Version 5.0.10 oder so, habe ihn nun auf 5.0.19 geupdatet. War also falscher Alarm. Sorry für deine Zeitverschwendung, aber auch die schnelle Antwort. Vielleicht hilft der Hinweis dann ja jemand anderem, der das selbe Problem hat. Möglicherweise hat auch schon der Neustart des Host-Controllers gereicht, um die Verbindung wieder herzustellen. Mich hatte die fehlende Meldung im Protokoll irritiert. Hab leider vergessen es aus- und wieder einzuschalten. ✌

      posted in Tester
      W
      Worlik
    • RE: Test Elgato Key Light Adapter

      Bisher hat der Adapter wunderbar funktioniert. Ich habe jetzt alle ioBroker Module geupdatet und jetzt startet der Adapter gar nicht mehr (3x rotes X beim Status, also auch keine Verbindung zum Host). Im Log sieht man leider gar nichts zum Problem, welches der Adapter genau hat. An was kann das liegen?

      posted in Tester
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @jogibear9988 Ja, so habe ich das nun auch gemacht. Man hat in dem Setup aber noch das Problem, dass bei einem Neustart des iobrokers gar nichts funktioniert, denn der WebAdapter ist ja noch nicht gestartet, wenn der Kioskbrowser schon startet. Ich habe nun im Startskript den Start um 120 Sekunden verzögert, dpms wieder eingeschaltet und den Reload-Button zusätzlich in der Oberfläche eingebaut. Sonst kann man Änderungen in der runtime ja auch gar nicht testen. Solange es keinen Fehler gibt, funktioniert das gut. Wenn javascript nicht läuft (wegen Skriptfehlern), hat man aber ein Problem. 😉 Aber das löse ich schon irgendwie, ist wie gesagt ja kein Problem der webui

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      Vielleicht braucht das ja noch jemand anderes, hier ist eine einfache Anleitung für den Kioskmodus auf dem Raspberry PI: https://tabula.info/dokuwiki/doku.php/anleitung_fuer_linux_kiosk_manuell - es gibt da auch ein automatisches Skript auf der selben Seite, habe ich aber nicht machen wollen, weil ich ja hier keine frische Installation hatte und eingreifen wollte.

      Der Schritt hier macht mir dabei noch etwas Probleme, was den SSH Login angeht:

      Zum automatischen Anmelden müsste man die Datei /etc/systemd/system/getty@tty1.service.d/autologin.conf (und ggf. das entsprechende Verzeichnis) anlegen, was > Raspi OS bereits hat. Der Minimalinhalt wäre:

      autologin.conf
      [Service]
      	ExecStart=
      	ExecStart=-/sbin/agetty --autologin "pi" %I
      

      Ansonsten läuft das aber einwandfrei und alles wird super dargestellt. Das Kontektmenü konnte ich leider noch nicht ans laufen bekommen (ist für einen manuellen Reload ja manchmal ganz nett).

      Das sind aber alles Problemchen, welche nichts mit der webui zu tun haben. 😉

      posted in Visualisierung
      W
      Worlik
    • RE: neue Visualisierung "webui" (alternative zu vis & vis-2)

      @jogibear9988 said in neue Visualisierung "webui" (alternative zu vis):

      • nutzen des types beim value schreiben bei bindings

      JIPIIEEE, nun muss ich nur noch eine Alternative für das surf-display auftreiben. Es gibt ganze Linuxdistributionen, welche nur einen Kioskmodus anbieten, irgendwas wird sich schon finden. 🙂

      posted in Visualisierung
      W
      Worlik
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo