Gå til innhold
Moskus

SCRIPT: CloneDevice.vb - Kopier devicestatus fra en til andre

Anbefalte innlegg

CloneDevice.vb

Speiler status fra en device over på flere andre. Praktisk for å f.eks. kunne skru av/på/dimme et helt rom samtidig.

 

Parameter: 100|200+201+202

... hvor 100 er master device (typisk taklampe) og 200-202 er andre devicer,

 

Trigges typisk av master device set to any status.

    Sub Main(ByVal parms As String)
        '© Moskus
        Dim input() As String = Split(parms.ToString, "|")
        Dim control As String = input(0).ToString
        Dim devs() As String = Split(input(1).ToString, "+")
        Dim devicevalue As Double = hs.DeviceValueEx(control)

        Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
        For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(control)
            If devicevalue = cc.ControlValue Then
                CAPIcontrol = cc
                Exit For
            End If
        Next

        For Each d as String In devs
            Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d)
            If CAPIcontrol.Label.ToLower.Contains("dim") Then
                If dev.Can_Dim(Nothing) Then
                    Dim capi As HomeSeerAPI.CAPIControl = Nothing
                    For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                        If cc.Label = CAPIcontrol.Label Then
                            capi = cc
                            Exit For
                        End If
                    Next
                    hs.CAPIControlHandler(capi)
                Else
                    Dim off As HomeSeerAPI.CAPIControl = Nothing
                    For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                        If cc.Label.ToLower = "off" Then
                            off = cc
                            Exit For
                        End If
                    Next
                    hs.CAPIControlHandler(off)
                End If
            Else
                Dim capi As HomeSeerAPI.CAPIControl = Nothing
                For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
                    If cc.Label = CAPIcontrol.Label Then
                        capi = cc
                        Exit For
                    End If
                Next
                hs.CAPIControlHandler(capi)
            End If

        Next
    End Sub

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Feilmelding 

Error 1	Running script C:\Program Files (x86)\HomeSeer HS3\scripts\StuaLysVindu.vb :Målet forårsaket et unntak under aktivering.Objektreferanse er ikke satt til en objektforekomst.

kopiert script, satt master og tre lys som jeg vil klone.

Skjermbilde 2017-05-03 kl. 19.43.11.png

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg kan ikke se noen åpenbare feil (utenom at du ikke trenger å gi scriptet et nytt navn, du endrer jo innstillingene i parameteren, så navnet kan være CloneDevice.vb. Men det spiller egentlig ingen rolle he).

 

Hva om du putter "Main" (uten hermetegn) i tekstfeltet for Sub/Function?

Finnes devicene 29, 401, 431 og 440? Har 401, 431 og 440 de samme CAPI-kommandoene som device 29 (ikke at det heller spiller noen rolle).

Del dette innlegget


Lenke til innlegg
Del på andre sider

Msin ga litt mer omstendig feilmelding(endret navnet, koblet ikke at det ikke er parameter i scriptet)

Running script C:\Program Files (x86)\HomeSeer HS3\scripts\CloneDevice.vb :Målet forårsaket et unntak under aktivering.->Does entry point Main exist in script? ved System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) ved System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) ved System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ved A.c17b105f989efe61e5979e67bec1ef734.cffd66cb0782c50126727e3fa75582d7a()

Men 29 er en Joweihueenhet. Endret Main til en z-wave, og da forsvant feilmeldingen, og skriptet fungerer. 

Tenkte at jeg var så heldig at jeg kunne skru på Hue-pæra med Huebryter/event. dimme, og så fulgte lampene i vinduene samt vitrineskapet etter(skjermen er så lav, så det går ikke med Lightify/Hue E-14 pærer(montert en fibaro-dimmer inni soklene).

Om det er automatikk på stuelysene så blir ikke generalen så fornøyd.

590a24be045a5_Skjermbilde2017-05-03kl_20_39_10.png.68fa1d72130219bccb3cb92154c406af.png590a24be4f574_Skjermbilde2017-05-03kl_20_39_41.png.b36f8bad98ef7d54b5bf9fba9f601596.png590a24be8bf1b_Skjermbilde2017-05-03kl_20_40_14.png.d5a7391183f76ec8d78289a3d97f6864.png590a24bebfa60_Skjermbilde2017-05-03kl_20_41_09.png.8ca64e43054a696c80b46e47524b5314.png

Tusen takk for hjelpen!

Del dette innlegget


Lenke til innlegg
Del på andre sider

Vel, dessverre ser det ut som om dette ikke vil fungere siden Hue bruker en skala mellom 0-254, og vanlige Z-wave-lamper bruker 0-100.

Hvis du dimmer en Hue-pære til 154 finnes ikke den samme verdien på Z-wave lampene.

 

Men er det ikke en innstilling i JowiHue hvor man kan endre dette?

Del dette innlegget


Lenke til innlegg
Del på andre sider
Vel, dessverre ser det ut som om dette ikke vil fungere siden Hue bruker en skala mellom 0-254, og vanlige Z-wave-lamper bruker 0-100.
Hvis du dimmer en Hue-pære til 154 finnes ikke den samme verdien på Z-wave lampene.
 
Men er det ikke en innstilling i JowiHue hvor man kan endre dette?

Takk, skal sjekke senere

Del dette innlegget


Lenke til innlegg
Del på andre sider

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå


  • Lignende innhold

    • Av Moskus
      Et lite script som gir deg gjennomsnittsforbruket for hvert 5. minutt. Parameter skilles med |. Første parameter er strømforbruket nå totalt strømforbruk, andre er output device.
       
      Private value_last As Double = 0 Private value_now As Double = 0 Private average As Double Private time_last As Integer Private time_now As Integer Private dev_average As Integer Private dev_usage As Integer Private devs() As String Public Sub Main(ByVal input As Object) devs = input.Split("|") dev_usage = devs(0) dev_average = devs(1) value_last = value_now value_now = hs.DeviceValueEx(dev_usage) time_last = hs.DeviceTime(dev_average) time_now = hs.DeviceTime(dev_usage) 'hs.WriteLog("Power debug", "value_last: " & value_last & ", value_now: " & value_now & ", time_last: " & time_last) If value_last > 0 Then average = Math.Round((value_now - value_last) / (time_last / 60.0), 3) 'hs.WriteLog("Power debug", "average: " & average) hs.SetDeviceValueByRef(dev_average, average, True) hs.SetDeviceString(dev_average, average.ToString("f3") & "kW", True) Else hs.SetDeviceValueByRef(dev_average, 0, True) hs.SetDeviceString(dev_average, "Waiting...", True) End If End Sub
       
       
      ... og et script for å "ta vare på" gårsdagens forbruk. Kjører kl. 23:59:45.
      Oppdater de to første og de to siste linjene med dine egne input og output devicer.
      Sub Main(parm As Object) Dim str As String = hs.DeviceString(155) Dim val As Double = hs.DeviceValueEx(155) hs.waitsecs(20) hs.SetDeviceValueByRef(1177, val, True) hs.SetDeviceString(1177, str, True) End Sub
    • Av Moskus
      Ble lei av å gi nytt navn til alle devicer squeezebox-pluginen oppretter, så jeg lagde et kjapt script for det. Parameter er IDen til root devicen for en spiller.
       
      Scriptet henter navnet på root'en, og erstatter "Player NN" med dette for root og alle child devicer. Dermed blir f.eks. "Player 7 Name" hetende "Stue Name", etc...
       
      Sub Main(parm As Object) 'Moskus 2018 Dim rootID As Integer = parm.ToString Dim root As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootID) Dim originaBase = root.Name(hs).Replace(" Name", "") Dim newBase As String = hs.DeviceString(rootID).Substring(hs.DeviceString(rootID).LastIndexOf(">") + 1).Replace(" ", "").Trim() hs.WriteLog("Rename", "Original base: '" & originaBase & "'") hs.WriteLog("Rename", "New base: '" & newBase & "'") 'Renaming devices root.Name(hs) = root.Name(hs).Replace(originaBase, newBase) Dim children() As Integer = root.AssociatedDevices(hs) For Each c As Integer In children Dim child As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(c) If child.Name(hs).Contains(originaBase) Then child.Name(hs) = child.Name(hs).Replace(originaBase, newBase) Next End Sub  
    • Av Guahtdim
      Jeg begynte på dette prosjektet fordi jeg hadde glemt å følge med på trykkmåleren for varmtvann til radiatorene i huset. Rørleggeren som så at det var nesten ikke vann i systemet lurte på om jeg hadde veldig god råd siden jeg risikerte å ødelegge hele systemet.
      Klok av skade så begynte jeg å drodle opp en løsning for å kunne automatisere overvåkningen siden tanken og måleren er i ett rom jeg ikke går ofte inn i (og selv når jeg er der så glemmer jeg å sjekke status).
      Tidligere har jeg laget overvåkning av elektrisitetsmåleren på loftet og jeg begynte med en lignende løsning.
      Foran måleren monterte jeg ett wifi webkamera med ir (jeg gikk for DLink DCS932L, men her er det sikkert mange som fungerer like bra). Dette kameraet kan man sette opp til å sende via ftp. Jeg sender ett bilde til en ftp-server som jeg har på en windowsserver (den magiske serveren som drar alt her i huset). Det tas ett nytt bilde ca hvert 5 minutt og det overskriver det eksisterende bildet siden jeg ikke trenger noe historikk.
       

      "Råbilde"
       
      På serveren har jeg en windows service som følger med på folderen som bildet legges inn i. Ved en ny eller endret jpg-fil begynner denne servicen å jobbe. Jeg bruker her ett gratis bibliotek som heter OpenCv til å undersøke bildet. Jeg har valgt veien via templates, mens en som kan bildebehandling sikkert ville brukt forskjellige andre funksjoner. I første omgang leter jeg igjennom bildet etter selve måleren ved hjelp av en mal og "klipper" ut den hvis jeg finner den.
       

      "Målermal"
       
      Etter litt bildebehandling sitter jeg igjen med.
       

      "Måleren"
       
      Etter dette bruker jeg en mal basert på måler nålen i ønsket posisjon og tester mot utklippet bilde. Jeg roterer malen slik at jeg tester for alle 360 grader. Det "treffet" som har høyest sannsynlighet tas vare på og lagres ned i en database.
       

      "Mal for målernål i ønsket posisjon (rotasjon 0 grader)"
       
      For å få dette over i Homeseer så har windows servicen en liten webserver basert på NancyFx som har kun en side som vises på localhost. Her kommer data som en semikolon separert streng hvor man har datanavn=data. Jeg prøvde å gjøre dette litt bedre med json i starten, men ble stående fast og gikk for en enkel løsning hvor data kommer som en tekststreng. Mulig jeg skal se på dette ved en senere anledning, men det er ingen hast siden dette er noe som kun brukes lokalt på min server.
      CS-scriptet kjøres hvert 20 minutt og henter ut data fra windows service. Veldig enkle greier som henter ut rotasjon i grader, sannsynlighet og bildets dato/tid og dette legges inn i hardkodede deviceId (virtuelle devicer). (Og man må jo lage seg 3 devicer i Homeseer som skal motta verdiene)
      Jeg har en event som sjekker om rotasjonen er over +/-10 grader. Hvis det skjer så får jeg en melding på sms. 
       

      "Oversikt i Homeseer"
       
      Script for å hente tall fra windows service
       

      I tillegg er det en windows service som er veldig spesifikk for meg.
      Hvis det er interresse så kan jeg prøve å lage noe mer generelt som folk kan leke med.
       
      Link til kildekode:
      https://github.com/oesolberg/MeterReaderService
       
      Link til zip-fil med service ferdig kompilert (23 MB pakket, 65 MB utpakket).
      http://bit.ly/MeterReaderHjemmeAutomasjon
       
      Hvordan å installere:
      Pakk ut alle filene i en egnet katalog (f.eks. c:\program files\meterreader) bruk Powershell og skriv inn følgende kommando : new-service -Name MeterReaderService -DisplayName "MeterReaderService" -Description "MeterReaderService" -BinaryPathName "c:\program files\meterreader\MeterReaderService.exe" -StartupType Manual  For å starte service kan du kjøre kommando (i powershell): start-service -name "MeterReaderService" For å endre litt på hva som skal overvåkes må du inn og editere i MeterReaderService.exe.config filen. Følgende er nå satt:
              <add key="folder" value="C:\temp\warmwater\" />     <!- Hvilken folder som overvåkes -->
              <add key="filter" value="*.jpg" />    <!- Hvilken filtype man skal trigge på (men her er jeg redd at det kun fungerer med jpg-filer) -->
              <add key="sleepinterval" value="2000"/>  <!- Antall millisekunder man skal vente fra en fil har endret seg til man begynner å behandle den -->
              <add key="port" value="1234"/>  <!- porten til Nancy webserver - url http://localhost:1234 -->
              <add key="MaalerMal" value="MeterMalWithGray.jpg" />  <!- filen som inneholder målermalen (må ligge i underkatalogen Templates) -->
              <add key="NaalMal" value="KorrektNaalMedGraatt.jpg" />  <!- filen som inneholder målernålen (må ligge i underkatalogen Templates) -->
    • Av GO_Nilsen
      Hei,
       
      Ønsker å bruke fibaroen til å styre garasjeport. Jeg trenger da et rele som kan pulse. Har kjøpt en fibaro relè switch. som er koblet til inngangen
      på garasjeport åpneren. Er det noen som kan hjelpe meg å lage en virtual device, som har en knapp. Den knappen gir en puls på f.eks. 1sek.
      Samme pulsen kjører port opp å ned.
       
      Fin om noen kan hjelpe meg her =)
       
       
       
       
    • Av Moskus
      Dette scriptet lar deg logge alle bevegelser til en device, slik at det blir enklere å se på web eller HStouch. Bevegelser (eller enhver hendelse) blir da logget slik.
       

       
      MotionLog.vb
      Public Sub Main(ByVal input As Object) Dim logDeviceRef As Integer = 1081 ' Update this Dim currentText As String = hs.DeviceString(logDeviceRef) Dim lines As System.Collections.Generic.List(Of String) If currentText.Contains("<br/>") Then lines = currentText.Split("<br/>").ToList Else lines = currentText.Split("<br>").ToList End If 'Removing empty lines and cleaing up strings For i As Integer = lines.Count - 1 To 0 Step -1 If lines(i).Trim = "" Then lines.RemoveAt(i) If lines(i).Contains("br/>") Then lines(i) = lines(i).Replace("br/>", "") If lines(i).Contains("br>") Then lines(i) = lines(i).Replace("br>", "") Next 'Remove the bottom entry if needed If lines.Count = 10 Then lines.RemoveAt(lines.Count - 1) 'Creating the device text Dim newText As String = Now.Date & " " & Now.ToLongTimeString & " - " & input.ToString If lines.Count > 0 Then newText &= "<br>" If lines.Count > 2 Then For i As Integer = 0 To lines.Count - 2 newText &= lines(i) & "<br>" Next ElseIf lines.Count = 2 Then newText &= lines(0) & "<br>" End If 'Adding the last lines without the HTML break newText &= lines(lines.Count - 1) 'Updating the device string hs.SetDeviceString(logDeviceRef, newText, True) 'hs.TriggerEvent("Restart SisteBeveglse timer") End Sub For hver bevegelsessensor har jeg da et event som blir trigget ved bevegelse (selvfølgelig! ), som i tillegg til å styre lys der det er nødvendig, kjører dette scriptet med sub Main og parameter med navnet på sensoren, som "Kjøkken" eller "Stue".
       
      I tillegg har jeg en timer som he ter "SisteBevegelse", som jeg resetter når dette skjer. Hvis du også vil bruke dette, må du opprette den timeren, lage et Event (som jeg har kalt "Restart SisteBevegelse timer" fordi det ikke finnes kode for å restarte den), og fjerne fnutten foran den nest siste linjen i koden.
       
       
      EDIT: Oppdatert slik at det blir penere i HStouch.  
×