Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [Idee] ioBroker Widgets auf iPhone mittels Scriptable App

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Idee] ioBroker Widgets auf iPhone mittels Scriptable App

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      blackst225 @kassmann last edited by

      @kassmann

      geh mal bitte in deinen webAdapter und schaue welchen Port du da eingerichtet hast.
      und WICHTIG den Haken in dem Adapter auf Eingebautes "Simple-API" setzen!

      K 1 Reply Last reply Reply Quote 0
      • K
        kassmann @blackst225 last edited by

        @blackst225 am Haken der Simlpe-API hat es gelegen. Danach klappt es. Leider nutze ich noch iQontrol und eben da muss es zwingend deaktiviert sein. 😥 Mist, Zwickmühle.

        1 Reply Last reply Reply Quote 0
        • IdleBit
          IdleBit last edited by IdleBit

          @kassmann Du kannst auch den neuen https://github.com/ioBroker/ioBroker.rest-api Adapter dafür nutzen 😉

          Edit:
          Hier einmal die angepasste getValue Function

          async function getValue(point) {
              try {
                  const req = new Request(`${host}/v1/state/${point}/plain`)
                  const value = await req.loadString()
                  return value;
              } catch (err) {
                  console.error(err)
                  return "n/a"
              }
          }
          
          K 1 Reply Last reply Reply Quote 0
          • K
            kassmann @IdleBit last edited by

            @idlebit Ich bin für alles offen 😊 . Nur sind meine Kenntnisse vom Programmieren, ähm nicht vorhanden 😵

            Bei mir zieht es jetzt so aus.

            async function getValue(point) {
                try {
                    const req = new Request(`${192.168.178.xx:xxxx}/v1/state/${plenticore.0.devices.local.Pv_P}/plain`)
                    const value = await req.loadString()
                    return value;
                } catch (err) {
                    console.error(err)
                    return "n/a"
                }
            }
            
            

            Bleiben die "{" oder das "$" vor und nach meinen Einfügungen drin? Denn dann kommt eine Fehlermeldung: "2022-04-27 14:24:29: Error on line 3: SyntaxError: Unexpected number '.178'. Expected a closing '}' following an expression in template literal."

            Ohne die "{" oder das "$" kommt zwar keine Fehlermeldung, aber auch kein Werte. Wenn ich aber "http://192.168.178.xx:xxxx/v1/state/plenticore.0.devices.local.Pv_P/plain" im Browser eingebe, kommt der Wert.

            Sorry für die vielleicht blöde Frage... 😬

            IdleBit 1 Reply Last reply Reply Quote 0
            • IdleBit
              IdleBit @kassmann last edited by

              @kassmann
              "host" und "point" sind Variablen!
              Du musst nur die Funktion die ich gepostet habe hier austauschen
              https://gist.github.com/hacki11/0a3bfbd3c5bc7d6ed460a43799687736
              und der Rest läuft dann wie von @blackst225 hier oben wie beschrieben.

              K 1 Reply Last reply Reply Quote 0
              • K
                kassmann @IdleBit last edited by

                @idlebit Ah, jetzt habe ich es verstanden. 👍

                IdleBit 1 Reply Last reply Reply Quote 0
                • IdleBit
                  IdleBit @kassmann last edited by

                  Ich habe das gestern auch mal Probiert, aber nur ganz Basic.
                  Geht erstaunlich gut 🙂

                  80b8174e-b422-4c2a-a6e0-62c0ee48f95f-image.png

                  K 1 Reply Last reply Reply Quote 1
                  • K
                    kassmann @IdleBit last edited by

                    @idlebit sieht auf jeden Fall besser aus als meins 😕 C6F330DD-5B3A-4829-940C-375724A3DB34.jpeg
                    Bekomme ich die Nachkommastellen noch gekürzt?

                    1 Reply Last reply Reply Quote 0
                    • IdleBit
                      IdleBit last edited by

                      @kassmann Ja mit z.B. toFixed() kann man die nachkommerstellen begrenzen.https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

                      Sonst zeig mal deinen Code.

                      K 1 Reply Last reply Reply Quote 0
                      • K
                        kassmann @IdleBit last edited by

                        @idlebit

                        let host = args.widgetParameter;
                        if (!host)
                          host = "http://xxxxxx"
                        
                        console.log(host)
                        
                        
                        let widget = await createWidget()
                        Script.setWidget(widget)
                        widget.presentSmall()
                        Script.complete()
                        
                        async function createWidget() {
                        
                            const list = new  ListWidget()
                        
                            try {
                                const line1 = list.addText(await getValue("plenticore.0.devices.local.Pv_P") + " W")
                                line1.font = Font.boldSystemFont(17)
                                line1.textColor = Color.green()
                            
                                const line2 = list.addText(await getValue("plenticore.0.devices.local.battery.SoC") + " %")
                                line2.font = Font.boldSystemFont(17)
                                line2.textColor = Color.orange()
                        
                                return list
                        
                            } catch(err) {
                                const errorList = new ListWidget()
                                errorList.addText(err)
                                return errorList
                            }
                        }
                        
                        async function getValue(point) {
                            try {
                                const req = new Request(`${host}/v1/state/${point}/plain`)
                                const value = await req.loadString()
                                return value;
                            } catch (err) {
                                console.error(err)
                                return "n/a"
                            }
                        }
                        
                        
                        IdleBit 1 Reply Last reply Reply Quote 0
                        • IdleBit
                          IdleBit @kassmann last edited by IdleBit

                          So ist in Zeile 18 der Wert auf 2 Stellen gekürzt, aber nicht gerundet.

                          let host = args.widgetParameter;
                          if (!host)
                            host = "http://xxxxxx"
                           
                          console.log(host)
                           
                           
                          let widget = await createWidget()
                          Script.setWidget(widget)
                          widget.presentSmall()
                          Script.complete()
                           
                          async function createWidget() {
                           
                              const list = new  ListWidget()
                           
                              try {
                                  const line1 = list.addText(Number(await getValue("plenticore.0.devices.local.Pv_P")).toFixed(2)+ " W")
                                  line1.font = Font.boldSystemFont(17)
                                  line1.textColor = Color.green()
                              
                                  const line2 = list.addText(await getValue("plenticore.0.devices.local.battery.SoC") + " %")
                                  line2.font = Font.boldSystemFont(17)
                                  line2.textColor = Color.orange()
                           
                                  return list
                           
                              } catch(err) {
                                  const errorList = new ListWidget()
                                  errorList.addText(err)
                                  return errorList
                              }
                          }
                           
                          async function getValue(point) {
                              try {
                                  const req = new Request(`${host}/v1/state/${point}/plain`)
                                  const value = await req.loadString()
                                  return value;
                              } catch (err) {
                                  console.error(err)
                                  return "n/a"
                              }
                          }
                          

                          Gerundet würde die Zeile so ausgehen:

                          const line1 = list.addText(Math.round(Number(await getValue("plenticore.0.devices.local.Pv_P")) * 100) / 100 + " W")
                          
                          K 1 Reply Last reply Reply Quote 0
                          • K
                            kassmann @IdleBit last edited by

                            @idlebit ungerundet ist völlig ausreichend, super vielen Dank.

                            Kannst du eventuell deinen Code auch posten? Würde da gern was kombinieren. 😁

                            IdleBit 1 Reply Last reply Reply Quote 0
                            • IdleBit
                              IdleBit @kassmann last edited by

                              @kassmann Ja kann ich, ist aber nur so eben schnell hingeschmissen der Code

                              let host = args.widgetParameter;
                              if (!host)
                                  host = "http://192.168.0.203:8093"
                              
                              let widget = await createWidget()
                              Script.setWidget(widget)
                              widget.presentSmall()
                              Script.complete()
                              
                              
                              async function createWidget() {
                                  // let g = new LinearGradient();
                                  // g.colors = [Color.red(), Color.red(), Color.blue(), Color.blue()];
                                  // g.locations = [0, 0.5, 0.5, 1];
                              
                                  const widget = new ListWidget();
                                  //list.backgroundGradient = g;
                              
                                  const nextRefresh = Date.now() + (1000 * 30) // add 30 second to now
                              
                                  widget.refreshAfterDate = new Date(nextRefresh)
                              
                                  try {
                                      const solarHeader = widget.addText("Solar Strom");
                                      solarHeader.font = Font.boldSystemFont(12);
                                      solarHeader.centerAlignText();
                              
                                      const solar = widget.addText(`${await getValue("solax.0.data.acpower")}W | ${Number(await getValue("sourceanalytix.0.solax__0__data__yieldtotal.currentYear.consumed.01_currentDay")).toFixed(1)}kWh | ${await getValue("sourceanalytix.0.solax__0__data__yieldtotal.currentYear.costs.01_currentDay")}€`);
                                      solar.font = Font.boldSystemFont(16);
                                      solar.centerAlignText();
                              
                                      widget.addSpacer();
                              
                                      const netzHeader = widget.addText("Netz Strom");
                                      netzHeader.font = Font.boldSystemFont(12);
                                      netzHeader.centerAlignText();
                              
                                      const netz = widget.addText(`${await getValue("sonoff.0.SmartMeter.LK13BE_current")}W | ${Number(await getValue("sourceanalytix.0.sonoff__0__SmartMeter__LK13BE_total.currentYear.consumed.01_currentDay")).toFixed(1)}kWh | ${await getValue("sourceanalytix.0.sonoff__0__SmartMeter__LK13BE_total.currentYear.costs.01_currentDay")}€`);
                                      netz.font = Font.boldSystemFont(16);
                                      netz.centerAlignText();
                              
                                      widget.addSpacer();
                              
                                      const houseHeader = widget.addText("Haus Strom");
                                      houseHeader.font = Font.boldSystemFont(12);
                                      houseHeader.centerAlignText();
                              
                                      const house = widget.addText(`${await getValue("0_userdata.0.Energy.CurrentHouseEnergyConsumption")}W | ${await getValue("0_userdata.0.Energy.TotalHouseEnergyToday")}kWh | ${await getValue("0_userdata.0.Energy.EnergyAutakie")}%`);
                                      house.font = Font.boldSystemFont(16);
                                      house.centerAlignText();
                              
                                      widget.addSpacer();
                              
                                      const description = widget.addText(`Stand: ${new Date().toLocaleTimeString()} Uhr`);
                                      description.centerAlignText();
                                      description.font = Font.mediumSystemFont(9);
                              
                                      return widget;
                              
                                  } catch (err) {
                                      const errorList = new ListWidget();
                                      errorList.addText(err);
                                      return errorList;
                                  }
                              }
                              
                              async function getValue(point) {
                                  try {
                                      const req = new Request(`${host}/v1/state/${point}/plain`)
                                      const value = await req.loadString()
                                      return value;
                                  } catch (err) {
                                      console.error(err)
                                      return "n/a"
                                  }
                              }
                              
                              K 1 Reply Last reply Reply Quote 0
                              • K
                                kassmann @IdleBit last edited by

                                @idlebit Kannst du mir nochmal helfen, ich hoffe, dass letzte mal 😥. Hier mal ein kurzer Auszug, ich hoffe der reicht.

                                widget.refreshAfterDate = new Date(nextRefresh)
                                 
                                    try {
                                        const solarHeader = widget.addText("Solar Strom");
                                        solarHeader.font = Font.boldSystemFont(12);
                                        solarHeader.centerAlignText();
                                 
                                        const solar = widget.addText(`${await getValue("plenticore.0.devices.local.Pv_P")).toFixed(2)}W | 
                                        ${Number(await getValue("plenticore.0.scb.statistic.EnergyFlow.EnergyHomePvDay")).toFixed(1)}kWh`);
                                        solar.font = Font.boldSystemFont(16);
                                        solar.centerAlignText();
                                

                                In Zeile 8 wird die Kürzung der Kommastelle nicht ausgeführt und es kommt der Fehler:
                                SyntaxError: Unexpected token ')'. Expected a closing '}' following an expression in template literal.

                                Zeile 9 klappt.

                                Schon mal Danke

                                IdleBit 1 Reply Last reply Reply Quote 0
                                • IdleBit
                                  IdleBit @kassmann last edited by IdleBit

                                  EDIT:
                                  Ein Number fehlte

                                  widget.refreshAfterDate = new Date(nextRefresh)
                                   
                                      try {
                                          const solarHeader = widget.addText("Solar Strom");
                                          solarHeader.font = Font.boldSystemFont(12);
                                          solarHeader.centerAlignText();
                                   
                                          const solar = widget.addText(`${Number(await getValue("plenticore.0.devices.local.Pv_P")).toFixed(2)}W | 
                                          ${Number(await getValue("plenticore.0.scb.statistic.EnergyFlow.EnergyHomePvDay")).toFixed(1)}kWh`);
                                          solar.font = Font.boldSystemFont(16);
                                          solar.centerAlignText();
                                  
                                  K severendis 2 Replies Last reply Reply Quote 0
                                  • K
                                    kassmann @IdleBit last edited by

                                    @idlebit Ein Traum, tausend Dank 😀

                                    1 Reply Last reply Reply Quote 0
                                    • severendis
                                      severendis @IdleBit last edited by

                                      @idlebit

                                      Hallo!

                                      Ich habe hier ein Problem, das es bei Deinem Sycript bei mir zur Ausgabe "File state/....." kommt und das an jeder Stelle wo ein Wert stehen sollte.

                                      Der Datenpunkt stimmt. In der einfacheren Version (danke @blackst225 ) habe ich die Ausgabe bekommen.
                                      Bitte nur die erste Zeile der Datenausgabe beachten. Die anderen beiden hatte ich noch nicht angepasst.

                                      Was kann das sein?

                                      Danke schon mal!

                                      let host = args.widgetParameter;
                                      
                                      if (!host)
                                      
                                          host = "http://192.168.11.166:8082"
                                      
                                       
                                      
                                      let widget = await createWidget()
                                      
                                      Script.setWidget(widget)
                                      
                                      widget.presentSmall()
                                      
                                      Script.complete()
                                      
                                       
                                      
                                       
                                      
                                      async function createWidget() {
                                      
                                          // let g = new LinearGradient();
                                      
                                          // g.colors = [Color.red(), Color.red(), Color.blue(), Color.blue()];
                                      
                                          // g.locations = [0, 0.5, 0.5, 1];
                                      
                                       
                                      
                                          const widget = new ListWidget();
                                      
                                          //list.backgroundGradient = g;
                                      
                                       
                                      
                                          const nextRefresh = Date.now() + (1000 * 30) // add 30 second to now
                                      
                                       
                                      
                                          widget.refreshAfterDate = new Date(nextRefresh)
                                      
                                       
                                      
                                          try {
                                      
                                              const solarHeader = widget.addText("Solar Strom");
                                      
                                              solarHeader.font = Font.boldSystemFont(12);
                                      
                                              solarHeader.centerAlignText();
                                      
                                              const solar = widget.addText(`${await getValue("0_userdata.0.Huawei.Inverter.PV_P")}W | ${await getValue("0_userdata.0.Huawei.Inverter.PV_P")}kWh | ${await getValue("0_userdata.0.Huawei.Inverter.PV_P")}€`);
                                      
                                              solar.font = Font.boldSystemFont(16);
                                      
                                              solar.centerAlignText();
                                      
                                       
                                      
                                              widget.addSpacer();
                                      
                                       
                                      
                                              const netzHeader = widget.addText("Netz Strom");
                                      
                                              netzHeader.font = Font.boldSystemFont(12);
                                      
                                              netzHeader.centerAlignText();
                                      
                                       
                                      
                                              const netz = widget.addText(`${await getValue("sonoff.0.SmartMeter.LK13BE_current")}W | ${Number(await getValue("sourceanalytix.0.sonoff__0__SmartMeter__LK13BE_total.currentYear.consumed.01_currentDay")).toFixed(1)}kWh | ${await getValue("sourceanalytix.0.sonoff__0__SmartMeter__LK13BE_total.currentYear.costs.01_currentDay")}€`);
                                      
                                              netz.font = Font.boldSystemFont(16);
                                      
                                              netz.centerAlignText();
                                      
                                       
                                      
                                              widget.addSpacer();
                                      
                                       
                                      
                                              const houseHeader = widget.addText("Haus Strom");
                                      
                                              houseHeader.font = Font.boldSystemFont(12);
                                      
                                              houseHeader.centerAlignText();
                                      
                                       
                                      
                                              const house = widget.addText(`${await getValue("0_userdata.0.Energy.CurrentHouseEnergyConsumption")}W | ${await getValue("0_userdata.0.Energy.TotalHouseEnergyToday")}kWh | ${await getValue("0_userdata.0.Energy.EnergyAutakie")}%`);
                                      
                                              house.font = Font.boldSystemFont(16);
                                      
                                              house.centerAlignText();
                                      
                                       
                                      
                                              widget.addSpacer();
                                      
                                       
                                      
                                              const description = widget.addText(`Stand: ${new Date().toLocaleTimeString()} Uhr`);
                                      
                                              description.centerAlignText();
                                      
                                              description.font = Font.mediumSystemFont(9);
                                      
                                       
                                      
                                              return widget;
                                      
                                       
                                      
                                          } catch (err) {
                                      
                                              const errorList = new ListWidget();
                                      
                                              errorList.addText(err);
                                      
                                              return errorList;
                                      
                                          }
                                      
                                      }
                                      
                                       
                                      
                                      async function getValue(point) {
                                      
                                          try {
                                      
                                              const req = new Request(`${host}/v1/state/${point}/plain`)
                                      
                                              const value = await req.loadString()
                                      
                                              return value;
                                      
                                          } catch (err) {
                                      
                                              console.error(err)
                                      
                                              return "n/a"
                                      
                                          }
                                      
                                      }
                                      
                                      IdleBit 1 Reply Last reply Reply Quote 0
                                      • IdleBit
                                        IdleBit @severendis last edited by IdleBit

                                        @severendis mein Script ist für den neuen https://github.com/ioBroker/ioBroker.rest-api Adapter, nutzt du den auch?

                                        Hier zu lesen 🙂

                                        severendis 1 Reply Last reply Reply Quote 0
                                        • severendis
                                          severendis @IdleBit last edited by

                                          @idlebit
                                          Ich habe das nicht so für voll genommen, da dort stand "du kannst den benutzen".
                                          Na ja - mein Fehler.

                                          Kann ich den im ioBroker zusätzlich installieren, oder geht dann der Simple API Adapter nicht mehr?

                                          IdleBit 1 Reply Last reply Reply Quote 0
                                          • IdleBit
                                            IdleBit @severendis last edited by

                                            @severendis Ja das kannst Du, kannst aber auch die 'getValue()' Funktion auf die ursprüngliche Version wieder ändern,
                                            so brauchst du dafür nicht extra den Adapter installieren.

                                            severendis 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            803
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            apple ios scriptable widget
                                            15
                                            54
                                            7444
                                            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