Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. LaMetric oder JSON-POST per IOBroker Javascript

    NEWS

    • [erledigt] 15. 05. Wartungsarbeiten am ioBroker Forum

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    LaMetric oder JSON-POST per IOBroker Javascript

    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      gammler2003 @gammler2003 last edited by

      Mittlerweile konnte ich mein Problem tatsächlich lösen und kann jetzt per Script eine Indikator-App auf meiner LaMetric füttern.

      Here we go:

      var http = require('http'); 
      var accesstoken = 'xxx'; // Hier den Accesstoken der App eingeben
      var deviceIpAddress = '192.168.x.x'; /lokale IP der LaMetric
      var port = '8080';
      
      
       
      var optionsTemplate = {
          host: deviceIpAddress,
          port: port,
          path: null,
          method: 'POST',
          headers: {
              'Content-Length': null,
              'X-Access-Token': accesstoken
      
              }
      };
      
      function LaMetricIndicator(options,data) {
       
          var dataString = JSON.stringify(data);
          options.headers['Content-Length'] = dataString.length;
       
          var req = http.request(options, function(res) {
              log('http Status: ' + res.statusCode);
              //log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 201 ? 'warn' : 'info'));
       
              var bodyChunks  = [];
              res.on('data', function(chunk) {
                  bodyChunks.push(chunk);
              }).on('end', function() {
                  var body = Buffer.concat(bodyChunks);
                  log('body: ' + body);
              });
          });
       
          req.on('error', function(e) {
              log('ERROR: ' + e.message, 'warn');
          });
       
          (dataString ? req.write(dataString) : log('Daten: keine Daten im Body angegeben'));
          req.end();
      }
       
      // Indicator Fensterstatus setzen
       
      optionsTemplate.path = '/api/v1/dev/widget/update/com.lametric.xxx/3';
      // xxx mit Teil aus der Local Push Url der App ersetzen.
      
      var dataTemplate = {
          frames:[{
      
              text: 'Weihnachten',
              icon: 'a1817',
              index: 0,
          }]
      }
       
       LaMetricIndicator(optionsTemplate,dataTemplate); 
      

      Der API-Key wird NICHT benötigt.
      Ich hoffe, das hilft dem einen oder anderen. Bei Fragen gerne melden.

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @gammler2003 last edited by

        In den letzten Tagen habe ich den LaMetric Adapter ordentlich weiter entwickelt. Man kann nun mit der "My Data (DIY)" App beliebige Datenpunkte auf der LaMetric Time darstellen. Das wird für viele wahrscheinlich viel Programmierarbeit sparen - zumal man keine eigenen Apps mehr anlegen braucht usw.

        https://www.youtube.com/watch?v=jxRM-UR1NHw

        siggi85 1 Reply Last reply Reply Quote 1
        • siggi85
          siggi85 @haus-automatisierung last edited by

          @haus-automatisierung Meine Lametric ist der einzige Grund, warum ich noch eine FHEM Instanz betreibe. Danke, dass du den ioBroker Adapter weiter entwickelst. 😁👍
          Weiß noch nicht wann ich zum Testen komme, aber wenn ich die Icons auf der Clock App hiermit anpassen kann (habe ich bisher nichts im Video gesehen, wo das gehen könnte), dann kann ich das bald zurückbauen. Die Notifications werde ich definitiv auf diesen Adapter umstellen. 😉

          haus-automatisierung 1 Reply Last reply Reply Quote 1
          • haus-automatisierung
            haus-automatisierung Developer Most Active @siggi85 last edited by

            @siggi85 Muss mir mal angucken wie das genau geht mit den Clock faces. Ist ja glaube ich nicht offiziell dokumentiert?

            siggi85 1 Reply Last reply Reply Quote 0
            • siggi85
              siggi85 @haus-automatisierung last edited by

              @haus-automatisierung sagte in LaMetric oder JSON-POST per IOBroker Javascript:

              @siggi85 Muss mir mal angucken wie das genau geht mit den Clock faces. Ist ja glaube ich nicht offiziell dokumentiert?

              Gute Frage, ich habe es damals im FHEM Forum gefunden. Die Icons werden als Base64 übergeben.

              haus-automatisierung 2 Replies Last reply Reply Quote 1
              • haus-automatisierung
                haus-automatisierung Developer Most Active @siggi85 last edited by

                @siggi85 Ah stimmt, das hatte ich erstmal auf ToDo geschoben. Finde ich etwas schwierig zu bedienen.

                1 Reply Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @siggi85 last edited by

                  @siggi85 sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                  Gute Frage, ich habe es damals im FHEM Forum gefunden. Die Icons werden als Base64 übergeben.

                  Nur für Dich 🙂 Mit 1.1.2 gibt es einen neuen Datenpunkt für das Clockface.

                  siggi85 2 Replies Last reply Reply Quote 1
                  • siggi85
                    siggi85 @haus-automatisierung last edited by

                    @haus-automatisierung sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                    @siggi85 sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                    Gute Frage, ich habe es damals im FHEM Forum gefunden. Die Icons werden als Base64 übergeben.

                    Nur für Dich 🙂 Mit 1.1.2 gibt es einen neuen Datenpunkt für das Clockface.

                    Woa, Hammer! Dann muss ich mir auf jeden Fall morgen Mal freie Zeit freischaufeln um mir das anzuschauen. Vielen Dank schon Mal dafür! 😁👍

                    1 Reply Last reply Reply Quote 0
                    • siggi85
                      siggi85 @haus-automatisierung last edited by

                      @haus-automatisierung Funktioniert alles super! Habe heute meiner Tochter einen Film von Disney+ angemacht und in der Zeit alles (clockicons und unzählige Notifications) auf den neuen Adapter umgebaut. 😂

                      Ausschnitt alt


                      1af563a1-66fe-463a-9f62-0693184c8c53-grafik.png

                      Ausschnitt neu


                      21cd41bb-47a1-4af1-b3d2-a7c822fffc62-grafik.png

                      Ich hoffe ich klinge nicht undankbar, aber mir ist bei der Migration noch eine Funktion aufgefallen, die ich in dem Zusammenhang nutze: Wäre es noch möglich, eine Datenpunkt zu bauen, um generische Daten an eine App zu senden? Dann kann man sowohl mit custom Apps arbeiten, als auch Apps mit Infos füttern, ohne dass du extra Entwicklungsarbeit reinstecken musst. (Natürlich freue mich mich trotzdem riesig über meine Clockface Datenpunkt 😉 )

                      Als Beispiel: Ich habe damals eine eigene App gebaut, um die Lautstärke dahinzusenden. Dadurch kann ich auch mehrere schnelle Änderugen (wenn man bspw. auf der Fernbedienung Lautstärke+ drückt) gut verarbeiten. Notifications und pollbasierte DIY Apps sind hier leider keine Lösung.

                      Beispielaufruf meiner custom App DenonSound anhand der FEHM Anbindung

                      fhem.0.lametric.app | DenonSound push token=!!!!!!!!!!!!!== text=33 icon=a21067 channels=Sound
                      
                      haus-automatisierung S F 3 Replies Last reply Reply Quote 1
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active @siggi85 last edited by

                        @siggi85 Okay muss ich mir mal anschauen wie man das möglichst generisch implementieren könnte

                        siggi85 1 Reply Last reply Reply Quote 1
                        • siggi85
                          siggi85 @haus-automatisierung last edited by siggi85

                          @haus-automatisierung Die entsprechende App wird mir unter Apps korrekt aufgelistet und ich kann auch zu dieser App mit dem Button wechseln.
                          Benötigen würde ich halt sowas wie das im FHEM Modul funktioniert unterhalb von "app" (siehe Spoiler unten), also ggf. in jedem App-Ordner ein neuen Datenpunkt, dessen Inhalt dann als Parameter durch den Adapter an die entsprechende Lametric App übergeben wird.


                          https://fhem.de/commandref.html#LaMetric2

                          app
                          
                             set <LaMetric2_device> app <app_name> <action_id> [param1=value param2=value]
                          
                             Some apps can be controlled by specific actions. Those can be controlled by pre-defined actions and might have optional or mandatory parameters as well.
                             Examples:
                                 set lametric app clock alarm enabled=true time=10:00:00 wake_with_radio=false
                                 set lametric app clock alarm enabled=false
                          
                                 set lametric app clock clockface icon='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAOklEQVQYlWNUVFBgwAeYcEncv//gP04FMEmsCmCSiooKjHAFMEF0SRQTsEnCFcAE0SUZGBgYGAl5EwA+6RhuHb9bggAAAABJRU5ErkJggg=='
                          
                                 set lametric app stopwatch start
                                 set lametric app stopwatch pause
                                 set lametric app stopwatch reset
                          
                                 set lametric app countdown configure duration=1800 start_now=true
                                 set lametric app countdown start
                                 set lametric app countdown pause
                                 set lametric app countdown reset
                          
                          
                          
                             To send data to a private/shared app, use 'push' as action_id. It will require the access token as parameter so that the device will accept data for that particular app:
                          
                             token - type: text - Private access token to be used when pushing data to an app. Can be retrieved from developer.lametric.com/applications/app/<app_number> of the corresponding app.
                          
                             Examples:
                                 set lametric app MyPrivateFHEMapp push token=ASDFGHJKL23456789 Show this message to my app.
                                 set lametric app MyPrivateFHEMapp push token=ASDFGHJKL23456789 icon=i334 Show this message to my app and use my icon.
                                 set lametric app MyPrivateFHEMapp push token=ASDFGHJKL23456789 Show this message to my app.\nThis is a second frame.
                                 set lametric app MyPrivateFHEMapp push token=ASDFGHJKL23456789 title="This is the head frame" This text goes to the 2nd frame.
                          
                          
                             If you have configured channels for your app and would like to address a specific one, you may add the parameter 'channels' accordingly:
                                 set lametric app MyPrivateFHEMapp push token=ASDFGHJKL23456789 channels=ch1,ch3 Show this message in 2 of 3 channels in my app.
                          

                          haus-automatisierung 1 Reply Last reply Reply Quote 0
                          • haus-automatisierung
                            haus-automatisierung Developer Most Active @siggi85 last edited by

                            @siggi85 Schon klar, aber da gibt es ja zig verschiedene App Typen. Und dann gibt es noch Verschiedene Channels usw. Ist nicht so easy das generisch zu bauen.

                            siggi85 1 Reply Last reply Reply Quote 1
                            • S
                              Samsotin @siggi85 last edited by

                              @siggi85 Hi mal eine Frage wie genau stellst du es an die Icons oder Gif's als Base64 im Clockface zu verwenden? Also wo genau nimmst du die Icons her und wandelst sie in Base64 um? Beziehst du die Icons von der LaMetric Developer Website?
                              Bei meinen Tests bekomme ich nichts oder einen grünen Haken...

                              1 Reply Last reply Reply Quote 0
                              • F
                                Fix @siggi85 last edited by

                                @siggi85 Jetzt habe ich vorhin grad einen eigenen Post eröffnet und sehe erst jetzt, dass da ja der alte Post hochgehoben wurde. Genau auch meine Frage wie die von @Samsotin. Bei mir bleibt das Display schwarz. Die ausprobierten Icons habe ich von der LaMetric Dev. Webseite geladen.

                                Danke & LG

                                Fix

                                1 Reply Last reply Reply Quote 0
                                • siggi85
                                  siggi85 @haus-automatisierung last edited by siggi85

                                  @haus-automatisierung sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                                  @siggi85 Schon klar, aber da gibt es ja zig verschiedene App Typen. Und dann gibt es noch Verschiedene Channels usw. Ist nicht so easy das generisch zu bauen.

                                  Habe das letztens so gelöst für mich:
                                  Habe einen Datenpunkt angelegt, an den ich JSON Content schicken kann, und dieser wird dann direkt an die lametric gesendet (die IP hole ich mir aber aus deinem Adapter 🙂 ).

                                  function volume(value) {
                                    if (value == true) {
                                      setState("0_userdata.0.helper.lametric_soundapp"/*lametric_soundapp*/, (['{ "frames": [ { "text": "Mute", "icon": ','43852',', "index": 0 } ] }'].join('')));
                                    } else if (!value) {
                                      setState("0_userdata.0.helper.lametric_soundapp"/*lametric_soundapp*/, (['{ "frames": [ { "text": "Mute", "icon": ','21067',', "index": 0 } ] }'].join('')));
                                    } else {
                                      setState("0_userdata.0.helper.lametric_soundapp"/*lametric_soundapp*/, (['{"frames": [ { "icon": "','21067','", "goalData": { "start": 0, "current": ',getState("denon.0.zoneMain.volume").val,', "end": 50 }, "index": 0 } ] }'].join('')));
                                    }
                                  }
                                  


                                  on({id: '0_userdata.0.helper.lametric_soundapp', change: "any"}, function (obj) {
                                  var value = obj.state.val;
                                  var oldValue = obj.oldState.val;
                                  exec((['curl -k -X POST -H "Accept: application/json" -H',' "X-Access-Token: XXXXXXXXXXXXXXXXXXXXXXX"',' -H "Cache-Control: no-cache" -d \'',(obj.state ? obj.state.val : ""),'\' https://',getState('lametric.0.meta.wifi.ip').val,':4343/api/v1/dev/widget/update/com.lametric.XXXXXXXXXXXXXXXXXXXXXXXXXX'].join('')));
                                  });
                                  

                                  Ein Feld in das man JSON einträgt und diesen dann mit den entsprechenden Access Token der App versendet, wäre bspw. eine generische Möglichkeit. Aber für mich reicht das erst mal so. 🙂

                                  @Samsotin @Fix
                                  Ich hole mir die Icons von der Lametric Seite: https://developer.lametric.com/icons
                                  Danach schaue ich nach der ID und hole mir dann den direkten Link des Icons (GIF oder PNG, je nach Image oder Animation):
                                  Bspw.:
                                  https://developer.lametric.com/content/apps/icon_thumbs/34.png
                                  https://developer.lametric.com/content/apps/icon_thumbs/87.gif
                                  Und den Link dann umrechnen lassen, bspw. hier: https://www.base64-image.de/

                                  Hier mal ein Beispielaufruf für eine dynamische Animation und ein statisches Icon (als Blockly Export):


                                  <block xmlns="https://developers.google.com/blockly/xml" type="control" id="=CV+c45iy2|c)LG|0@" x="29.61627960205078" y="-167">
                                  <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                  <field name="OID">lametric.0.apps.XXXXXXX.clock.clockface</field>
                                  <field name="WITH_DELAY">FALSE</field>
                                  <value name="VALUE">
                                  <block type="text" id="[6+H/R;8+Km?VSoGRWHV">
                                  <field name="TEXT">data:image/gif;base64,R0lGODlhCAAIAKIAACQiJIyKjMzOzPQCFLS2tPTGzPxabAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAACAAIAAADEwi6PPbNFBNlpSoEwUUOREgwZAIAIfkECQoAAAAsAAAAAAgACACCJCIkjIqMzM7M/FpstLa09MbMAAAAAAAAAxMIujw+rbg2JJ0qBMFFDkRIMGQCACH5BAkKAAAALAAAAAAIAAgAAAMUCLpsPqy8JuFyxoIQhBcKR4wEYyYAIfkECQoAAAAsAAAAAAgACAAAAxQIumw2o724ypRwhSC6UBshEkyZAAAh+QQJCgAAACwAAAAACAAIAIIkIiSMioz0AhS0trT8WmzMzswAAAAAAAADFAi6TCKkvbgclFeFUHrRwSAOTJkAACH5BAkKAAAALAAAAAAIAAgAAAMTCLo8Y6a9ImGNKgTBRQ5ESDBkAgA7</field>
                                  </block>
                                  </value>
                                  </block>


                                  <block xmlns="https://developers.google.com/blockly/xml" type="control" id="@Lw3WsbMavgGfy8AV`,2" x="29.61627960205078" y="1415">
                                  <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                  <field name="OID">lametric.0.apps.XXXXXXXX.clock.clockface</field>
                                  <field name="WITH_DELAY">FALSE</field>
                                  <value name="VALUE">
                                  <block type="text" id="%OQCe6N]QDoehGmPf0Lw">
                                  <field name="TEXT">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAUElEQVQYlWNUVFBgQAdXHnz/z8DAwKCjwMnIhCGLBlhgjHv37/+HsZUUFRlhprDAJDs6OhiQFX9jlGBgYGBgIGgFTgU6CpyMRJnAiM2byAAAfR4WsqJz+mUAAAAASUVORK5CYII=</field>
                                  </block>
                                  </value>
                                  </block>

                                  haus-automatisierung F S 3 Replies Last reply Reply Quote 1
                                  • haus-automatisierung
                                    haus-automatisierung Developer Most Active @siggi85 last edited by

                                    @siggi85 sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                                    Ein Feld in das man JSON einträgt und diesen dann mit den entsprechenden Access Token der App versendet

                                    Klar, ich könnte natürlich in der Konfiguration eine Liste mit AppIDs pflegen, welche "mehr können" und dann kann der Nutzer da JSON hinsenden. Aber mein Problem damit ist: Das ist doch sehr komplex und da entstehen sicher viele Fragen was eigentlich geht usw. Deswegen würde ich das gerne irgendwie abstrahieren und vereinfachen.

                                    Nur leider trifft da maximale Flexibilität auf einfache Bedienung. Mit dem MyData DIY habe ich dafür ja auch einen Umweg gemacht, nur damit der Nutzer nix mit JSON usw. zu tun hat.

                                    Theoretisch könnte es ja auch x eigene Apps auf der LaMetric geben, welche alle eigene Daten annehmen können.

                                    PS: Deine Funktion ist etwas tricky. Da musst Du aufpassen 🙂 !value ist z.B. auch die Zahl 0. Oder ein leerer String. Und gegen true würde ich mit === prüfen, anstatt mit ==. Ansonsten könnte es sein, dass dein else-Teil nie greift.

                                    !0 === true
                                    !0.0 === true
                                    !"" === true
                                    
                                    siggi85 1 Reply Last reply Reply Quote 1
                                    • F
                                      Fix @siggi85 last edited by

                                      @siggi85 sagte in LaMetric oder JSON-POST per IOBroker Javascript:

                                      https://www.base64-image.de/

                                      Hoi Siggi

                                      Herzlichen Dank für die Präzisierung. So klappts. Ich habe den Fehler gemacht, dass ich die grossen Icons von der Lametric Webseite heruntergeladen und umgewandelt habe. Das ist super so. Genau das suche ich seit Monaten, juhui!

                                      Lieben Gruss

                                      Fix

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        Samsotin @siggi85 last edited by

                                        @siggi85 auch von mir ein großes Dankeschön für die detaillierte Beschreibung. Jetzt klappt es.

                                        1 Reply Last reply Reply Quote 0
                                        • siggi85
                                          siggi85 @haus-automatisierung last edited by

                                          @haus-automatisierung Ich verstehe was du meinst. Wenn man den Datenpunkt aber RAW oder JSON nennt, dann muss halt jeder selbst entscheiden ob er überhaupt mit dem Datenpunkt arbeitet. Aber da ich nicht der Entwickler bin, habe ich da auch leicht reden. 😛
                                          Bezüglich der Funktion: Eigentlich ist das ein Blockly, weiß daher gar nicht ob/wie ich das nach deinen Vorgaben umsetzen könnte, ohne das Blockly in ein reines Javascript zu konvertieren (was eigentlich auch nicht schlimm wäre :P).
                                          Funktioniert mit den entsprechenden Datenpunkten (Mute und Volume) aus dem Denon Adapter aktuell aber ganz gut, daher werde ich das wahrscheinlich erst Mal so lassen. Spätestens wenn ich Probleme kriege, werde ich deinen Thread sicher wieder rauskramen. 😄
                                          Seit ich auf 4k TV umgestiegen bin, zeigt mein Denon Receiver leider nicht mehr die Volume auf dem TV an (gibt es wohl nur in höheren Produktserien die normale Anzeige auf dem TV 👎 ). Da der Denon versteckt in einem Schrank steht und nur über Harmony gesteuert wird, benötige ich die Funktion seit dem mehr denn je. Denn blind die Lautstärke einstellen ist wirklich keine Option.

                                          @Fix @Samsotin Freut mich, dass ich helfen konnte. 🙂

                                          P 1 Reply Last reply Reply Quote 1
                                          • P
                                            pietro @siggi85 last edited by pietro

                                            @haus-automatisierung
                                            Hi, ich verwende schon viele Jahre Lametric und habe dass, was dieser Adapter nun mit My Data DIY leistet mit 27 Handständen umgesetzt (hab mir dazu auch eine eigene Lametric-App gebaut).
                                            Ich bin total begeistert und möchte nun alles wieder etwas vereinfachen - ABER: Leider haben sehr viele meiner Datenpunkte (beinahe alle) einen Bindestrich im Namen - bei diesen Datenpunkten kann der Adapter leider nicht die Werte auslesen und schreibt ins json einfach den Namen des Datenpunktes anstatt des Wertes.

                                            Könntest Du dies bitte fixen ?!

                                            Vielen Dank !

                                            P haus-automatisierung 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            399
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            19
                                            69
                                            9885
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo