Gå til innhold
  • Bli medlem

Søk i nettsamfunnet

Viser resultater for emneknaggene 'script'.



Flere søkevalg

  • Søk etter emneknagger

    Skriv inn nøkkelord separert med kommaer.
  • Søk etter forfatter

Innholdstype


Kategorier

  • Generelt
    • Automasjonskaféen
    • Annen Elektronikk
    • Ditt system
    • Grafikk og design
    • Nettverk
    • Nybegynner
  • Bruksområder
    • A/V-kontroll
    • Belysning
    • Klimakontroll
    • Overvåking
    • Sikkerhet
    • Strømsparing og strøm-overvåkning
    • Talestyring
  • Systemer
    • Domoticz
    • Fibaro Home Center
    • Futurehome
    • HDL
    • Home Assistant
    • HomeKit
    • HomeSeer
    • Homey
    • Indigo Domotics
    • openHAB
    • Sensio
    • SmartThings
    • Telldus Live!
    • Vera
    • Z-Way
    • Zipato
    • Øvrige systemer
  • Teknologi / Protokoller
    • Blåtann
    • irDA
    • KNX
    • MQTT
    • RF
    • xComfort
    • Z-Wave
    • ZigBee
  • Utlån, kjøp og salg
    • Prisjakt
    • Kjøp / Salg
    • Powerbuy
    • Kommersielle tilbud
    • Utlån
  • Nettstedet
    • Kunngjøringer
    • Nyheter
    • Ris, ros og spørsmål om forumet

Blogger

  • En teknologisk hverdag
  • Enda en hobby?
  • Smånytt
  • en guide til elektro-verdenen

Kategorier

  • Nyheter
    • Produkter
    • Programvare
  • Tester
    • Systemer
  • Guider
    • Fibaro
    • HomeSeer
    • Nettverk
    • openHAB
    • Z-Wave

Finn resultater i...

Finn resultater som...


Startdato

  • Start

    Slutt


Sist oppdatert

  • Start

    Slutt


Filtrer etter antall...

Ble med

  • Start

    Slutt


Gruppe


System

Fant 32 resultater

  1. Dette scriptet lar deg hente inn trafikkinformasjon fra EnTur. Finne reiseruter, IDer for "StopPlace" og "Quay" Å bruke scriptet er ikke så vanskelig. Det vanskelige er å finne IDene til stasjonene du vil spore. La oss si at jeg vil finne alle busser som går fra "Tasta Senter" (og mot Stavanger sentrum, men det kommer vi tilbake til) Gå til en-tur.no Tast inn stoppesteder til og fra Kopier URL'en fra nettleseren etter søket (f.eks. som denne) inn URLdecoder.org for å gjøre den lettere å lese. Finn "startID" og kopier ut strengen som begynner med "NSR:". For Tasta Senter er denne "NSR:StopPlace:28163" Vel og bra! Nå vet vi at busstoppet ved Tasta Senter heter "NSR:StopPlace:28163". Men et busstopp kan faktisk ha flere plattformer, f.eks. en på hver side av veien. Det heter visst "Quay" på engelsk. Jeg er ikke interessert i begge sider av veien for kun en av dem har vanligvis trafikk mot sentrum. For å finne Quay, må vi bruke GraphQL-exploreren til EnTur (som dessverre ikke er like forseggjort som Tibber sin). Vi er interessert i denne spørringen som finner alle avganger for et stoppested, og vi må endre id: "NSR:StopPlace:28163" og avgangstiden (startTime:"2018-06-19T09:00:00+0200") til det riktige. I skrivende stund ser min spørring slik ut. Så går vi gjennom resultatene, vi skal prøve å finne riktig "Quay". Det første treffet er inneholder denne teksten: "destinationDisplay": { "frontText": "Tasta - Vardeneset" }, "quay": { "id": "NSR:Quay:48450" }, ... men en buss med "Tasta - Vardeneset" tar meg i feil retning! Ergo er "NSR:Quay:48450" ikke riktig. Det neste treffet inneholder dette: "destinationDisplay": { "frontText": "Stavanger" }, "quay": { "id": "NSR:Quay:48449" }, Jepp! Riktig! Altså kan vi filtrere på "NSR:Quay:48449" for å finne avganger fra "NSR:StopPlace:28163" som kun går mot Stavanger. Installasjon Du trenger en referanse til Newtonsoft.Json.dll for at scriptet skal fungere. Json er mye i bruk i dag, og siden jeg har oppdaget at Webclient nå er innebygget i HS3 (og superenkel å bruke), så er det bare å legge inn Json-støtte for scripting også. Lukk HS3. Åpne settings.ini Finn linjen som begynner med ScriptingReference= Vanligvis står det kun System.Core;System.Core.dll. Vi skal legge til Newtonsoft bak der. Hos meg (på Windows) skal linjen da se slik ut: ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;C:\Program Files (x86)\HomeSeer HS3\Bin\homeseer\Newtonsoft.Json.dll Lagre og start HS3 igjen. For Linux skal den muligens se slik ut, men du må sjekke plasseringen på /bin/homeseer/Newtonsoft.Json.dll selv. ScriptingReferences=System.Core;System.Core.dll,Newtonsoft.Json;/usr/local/HomeSeer/bin/homeseer/Newtonsoft.Json.dll Kopier scriptet under og lagre det som EnTur.vb. Etter massiv testing fra @Tor-Erik er vi ganske sikre på at det også kjører på Linux. EnTur.vb: Du må også lage deg noen devicer selv for å faktisk vise data. Dette gjør foreløpig ikke scriptet for deg. Den trenger ingen status values, men kanskje en enkel status Graphics for å ha et ikon (istedenfor Off/Dim/On-ikoner) Så trenger vi et event for å oppdatere teksten. Dette kan f.eks. kjøre hvert minutt. Parametre for funksjonen "CallsFromStopplace" er deviceID, stopplaceID, quayID (optional), antall_avganger (optional). Du kan ha flere script-kall i et event, hvis du har flere stopp, avganger, etc du vil kontrollere. Parametre for funksjonen "TripsBetweenStops" er deviceID, stopplaceID (fra), stopplaceID (til), antall_avganger (optional). Det er et enkelt ruteoppslag, fint fra større stasjoner (f.eks. "Stavanger") til et bestemt stoppested. DeviceValue i hver device er antall minutter til neste avgang. Kan brukes til automasjon.
  2. Rufus

    Dør og vindu script

    Jeg ønsker å få til en virtuell device for alle vinduer, og en for dørene. Denne skal oppdateres med hvilke vinduer/dører som er åpne til en hver tid. Eventuelt om alle er lukket. Scripting er jeg ganske fersk med, så det har blitt litt copy paste fra her inne samt homeseer forumet. Fant et script som skal gjøre akkurat det jeg trenger, men jeg får warning i loggen : VB.Net script exception(0), re-starting: Object reference not set to an instance of an object Noen som har noen tips, er det noe åpenbart jeg har misset her? Til info så har jeg oppdatert scriptet med mine devicer Jeg kjører forøvrig HS3 på Raspbian. ' these are the virtual devices to be updated by the script '423 Windows '424 Doors 'Use the reference ID of the door or window sensor devices in the arrays below Public Sub Main(ByVal Parms as Object) Dim array_windows() as string = {"221", "217", "215", "213", "211"} Dim array_doors() as string = {"219", "209"} Dim windows_count as integer = 0 Dim window_name as string = "" Dim wstr as string = "" Dim doors_count as integer = 0 Dim door_name as String = "" Dim dstr as string = "" Dim dv as Object End Sub 'Using 2 subs, one for doors and the other for windows 'WINDOWS Sub windows(ByVal Parms as Object) Try windows_count = 0 window_name = "" wstr = "" for each devw as string in array_windows 'hs.writelog("Array", "Window " & window_name & " | Value " & hs.DeviceValue(devw)) if hs.DeviceValue(devw) = 1 then windows_count = windows_count + 1 dv = hs.GetDeviceByRef(devw) window_name = dv.Name(hs) wstr = wstr & window_name & ",<br>" hs.writelog("DoorWindow", window_name & " Open") 'hs.writelog("DoorWindow", array_windows) end if next If windows_count > 0 then hs.SetDeviceValueByRef(423,100,true) hs.SetDeviceString(423, wstr,true) Else hs.SetDeviceValueByRef(423,0,true) hs.SetDeviceString(423, "Alle vinduer lukket",true) End If hs.writelog("DoorWindow", "Window Count: " & windows_count) Catch ex As Exception hs.WriteLog ("DoorWindow", "Error: " & ex.Message) End Try End Sub 'DOORS Sub doors(ByVal Parms as Object) Try doors_count = 0 door_name = "" dstr = "" for each devd as string in array_doors 'hs.writelog("Array", "Door " & door_name & " | Value " & hs.DeviceValue(devd)) if hs.DeviceValue(devd) = 1 then dv = hs.GetDeviceByRef(devd) door_name = dv.Name(hs) doors_count = doors_count + 1 dstr = dstr & door_name & ",<br>" hs.writelog("DoorWindow", door_name & " Open") end if next If doors_count > 0 then hs.SetDeviceValueByRef(424,100,true) hs.SetDeviceString(424, dstr,true) Else hs.SetDeviceValueByRef(424,0,true) hs.SetDeviceString(424, "Alle dører lukket",true) End If hs.writelog("DoorWindow", "Door Count: " & doors_count) Catch ex As Exception hs.WriteLog ("DoorWindow", "Error: " & ex.Message) End Try End Sub
  3. HSv

    Script for dimming av lys

    Jeg mener dette er min første post her - jeg har hatt mye hjelp av å lese her, og nå er det kanskje på tide jeg bidrar litt. Jeg har kikket etter et script som gjør det jeg ønsker (...og ikke minst på den måten jeg ønsker:-) uten å finne det - og har derfor prøvd å skrive et selv. Jeg har "hentet inspirasjon" fra noen av Moskus' scripts. Input parametre: <deviceref>:<start>:<stop>:<time> Litt opplagt igrunn - men uansett vil dette endre devicen fra start til stopp, og bruke (tilnærmet) tid på det. (På grunn av litt avrundinger, så kan det ta noen sekunder mer eller mindre enn det du oppgir) For å ikke sende altfor mange kommandoer, så begrenser jeg meg per default til maks 4 kommandoer per sec (kan konfigureres) Noen spesialverdier: start = -1 - da leser jeg nåværende verdi, og dimmer til stoppverdi start = -2 - da leser jeg nåværende verdi, og øker/minker denne med stoppverdien Eksempler: 100:10:30:5 - skru dev 100 fra 10% til 30% (uavhengig av hva nåværende verdi er)- og bruke 5 sec på det 100:-1:30:5 - skru device fra nåværende verdi til 30% - og bruke 5 sec. 100:-2:-10:5 - endre device 100 med sluttverdien. Her er både positiv og negativ verdi tillatt - Om device 100 var på 35% før du startet scriptet, så vil den være på 25% etterpå. (og igjen - bruker 5 sec) Dette er ikke veldig foolproof - det er helt sikkert mulig å legge inn verdier som kræsjer hele scriptet - men så lang så fungerer det som jeg vil. Blant annet så tester det ikke om det finnes noe <deviceref>... (ikke ennå iallefall) Jeg kjører HomeSeer på Linux - ikke testet ut på en Windows-serveer (Og jeg har strengt tatt ikke planer om å gjøre det heller...) Jeg bruker det hovedsakelig til to ting: Styre utelyset mitt på en litt elegant måte, samt å skånsomt skru opp lyset på soverommet om morgenen. Kommentarer er mer en velkommen. Endringsforslag og "bug-reports" likeså
  4. 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
  5. DeviceState.vb Lar deg lagre og laste inn innstillinger for et utvalgt av enheter. Synes du at lyset er perfekt akkurat nå? Lagre det! Og hent det tilbake senere. Sub Main(ByVal not_used As Object) 'By Moskus, August 2015 'Set up a new config. 'Specify devices between the brackets below (comma separated): Dim devices() As Integer = {342, 872, 873} 'Specify a configuration name. This is used when calling "Save" and "Load" later. Dim config_name As String = "Bedroom" 'Creating initial ini file and store it in a list Dim lst As New System.Collections.Generic.List(Of DeviceState) For Each d As Integer In devices Dim dS As New DeviceState dS.deviceRef = d dS.deviceValue = hs.DeviceValueEx(d) lst.Add(dS) Next 'Write the list to file SaveToFile(config_name, lst) End Sub Sub Save(ByVal config_name As String) 'Get the device list Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name) 'Get the current device values for each device For Each d As DeviceState In lst d.deviceValue = hs.DeviceValueEx(d.deviceRef) Next 'Store the list SaveToFile(config_name, lst) End Sub Sub Load(ByVal config_name As String) 'Get the device list Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name) For Each d As DeviceState In lst 'Find the correct CAPI based on device value... Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d.deviceRef) If d.deviceValue = cc.ControlValue Then CAPIcontrol = cc Exit For End If Next '... And execute it hs.CAPIControlHandler(CAPIcontrol) Next End Sub Function LoadFromFile(ByVal config_name As String) As System.Collections.Generic.List(Of DeviceState) Dim lst As New System.Collections.Generic.List(Of DeviceState) Dim filename As String = "DeviceState_" & config_name & ".ini" Dim lines() As String = hs.GetINISectionEx("Devices", filename) For Each line As String In lines Dim deviceRef As Integer = line.Split("=")(0).Trim Dim deviceValue As Double = line.Split("=")(1).Trim lst.Add(New DeviceState(deviceRef, deviceValue)) Next Return lst End Function Sub SaveToFile(ByVal config_name As String, ByVal stateList As System.Collections.Generic.List(Of DeviceState)) Dim filename As String = "DeviceState_" & config_name & ".ini" For Each d As DeviceState In stateList hs.SaveINISetting("Devices", d.deviceRef, d.deviceValue, filename) Next End Sub <Serializable> Public Class DeviceState Public Property deviceRef As Integer Public Property deviceValue As Double Public Sub New() End Sub Public Sub New(ByVal _deviceRef As Integer, ByVal _deviceValue As Double) Me.deviceRef = _deviceRef Me.deviceValue = _deviceValue End Sub End Class Oppsett: Det er to måter å lage et oppsett på. 1. Redigere Main()-sub'en med å liste opp device'referansene i krølleparantesene i denne linjen: Dim devices() As Integer = {342, 872, 873} og navnet i denne linjen: Dim config_name As String = "Bedroom" ... og så kjøre scriptet med å kalle Main-sub'en. 2. Lag en INI-fil i \Config-mappen på dette formatet: [Devices] devRef1=devValue1 devRef2=devValue2 devRef3=devValue3 Navngi den "DeviceState_DittVariabelNavn.ini" der du bytter ut DittVariabelNavn med noe mer beskrivende. Det er dette du skal kalle senere. Mitt testeksempel ser slik ut for DeviceState_Bedroom.ini: [Devices] 342=53 872=25 873=39 Når det er gjort er det bare å lage to eventer. Et for lagring og et for tilbakestilling. Lagring av lys gjøres med å kjøre scriptet "DeviceStates.vb" med funksjon "Save" og parameter satt til DittVariabelNavn, slik: Tilbakestilling er helt likt, men da bytter du ut "Save" med "Load". Det er da mulig å lage veldig enkle "scenes" med å kopiere en ini-fil og gi den et nytt navn, som f.eks. "Bedroom-Morning", "Bedroom-Sexytime", "Bedroom-Night", "Bedroom-Off", og så videre. Bare redigere ini-filene med passende verdier, og restore som det passer deg. Så lenge teknologien som styrer lyset lagrer devicevalue og bruker CAPI til kontroll (og det gjør vel alle skulle jeg mene), så vil dette fungere. Jeg tror til og med det fungerer med andre enheter (som f.eks. Squeezebox Play/Pause, og så videre).
  6. Tips fra @Andreas gjorde at jeg oppdaterte et gammelt (og ubrukelig) script slik at det nå er "brukelig" igjen. ResponsiveVoice.vb Sub Main(Byval input as Object) Dim speakThis as String = hs.ReplaceVariables(input.ToString) Dim remoteFile as String = "https://code.responsivevoice.org/getvoice.php?t=" & speakThis & "&tl=no&sv=g2&vn=&pitch=0.5&rate=0.5&vol=1" Dim localFile as String = hs.GetAppPath & "\tts.mp3" My.Computer.Network.DownloadFile(remoteFile, localFile, "", "", False, 3000, True) End Sub ... lagrer en MP3-fil som heter "tts.mp3" i HS3-katalogen din. Denne kan du spille av via Squeezebox, Sonos, eller HS3 Speaker client. "Paremeters" er selve strengen. Du kan bruke Replacement Variables. "Wait for script to finish before continuing" er viktig for å laste ned filen før du spiller den av. Jeg testet dette over kl. 11:15 og spilte av "Dette er en test! Klokken er kvart over elleve!". Imponerende.
  7. Vi har HSTouch på mobilene våre og jeg har lenge tenkt jeg skulle legge inn noen av de grafene jeg har tilgang på fra Device History. Startet med det i dag og da innså jeg at det var veldig begrenset hvor mye man kunne tilpasse grafene via vanlig event, mens man kunne gjøre mye mer tilpassninger via script. Med script ble det også en fordel at man bare trenger å endre ett sted om jeg vil endre noe på designet på grafene, i stedet for å måtte endre mange events. Sub Main(ByVal params as Object) ' @Author: ZoRaC ' @Version: 1.1 (2019-01-09) ' @Syntax: dvRef|time in hours|Y1-label ' SETTINGS Dim parameters() as String = params.ToString.Split("|") Dim dvRef As String = parameters(0) Dim hours As Integer = parameters(1) Dim y1Lbl As String = parameters(2) Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(dvRef) Dim dvName As String = dv.Name(Nothing) Dim filename As String = Nothing Dim seconds As Integer = hours*60*60 Dim timeString As String = parameters(1) & " timer" If hours > 24 Then timeString = "1 dag" End If If hours > 48 Then timeString = TimeSpan.FromSeconds(seconds).Days & " dager" End If ' CREATE GRAPH filename = hs.PluginFunction("Device History", "", "CreateChartEx",New Object(){dvRef,"{'Title': '" & dvName & " (" & timeString & ")', 'Y1Label': '" & y1Lbl & "','Y2Label': '','XLabel': 'Dato/Tid', 'ShowLegend': false, 'DurationType': 2, 'PeriodType': 1, 'Periods': " & hours & ", 'Style': 2, 'UseMarkers': false, 'Width': 460, 'Height': 310, 'RotateDegrees': 270}", "", ""}) End Sub I manualen til Device History finnes det mange flere parametere man kan putte inn for å tilpasse utseendet på grafen. Scriptet gir f.eks dette (med parametere: "789|24|% RH"): I HSTouch har jeg laget egne screens: Jeg har laget 3 events pr rom: På de 3 tekst-knappene over grafen har jeg satt "IgnorePresses=false" og lagt inn dette i "ActionWhenPressed": Vent i 1000ms, slik at den rekker å generere bildet. Deretter tvinger den den til å laste bildet på nytt - setter bare URL til det samme som den opprinnelig er (PNG-URLen): Slik ble resultatet:
  8. Nå er det mulig å styre en varmekilde med en vilkårlig temperatursensor og en vilkårlig varmekilde (av/på). Jeg har lovet i lengre tid å slippe script-pakken min, men det har vært litt mer utfordrende å lage en fungerende frontend. Nå har jeg imidlertid hoppet bukk over den problemstillingen og har flyttet innstillingene fra selve root-devicen og over i en tradisjonell ini-fil. Det gjør det lettere å endre alle innstillingene, selv om det er et stykke fra å være ideelt. Merk: Script-pakken er testet, men må vurderes som en beta-versjon. Egenskaper: "Auto", automatisk modus: Temperatur hentes ut fra et eller to oppsatte programmer. Programmene kan bruke ferdigdefinerte temperaturer eller egendefinerte. "Manual", manuell temperatur: justeres med nedtrekksboks og knapper for + og -) "High" og "Low" for hurtigvalg av forhåndsdefinerte "Schedule" og "AlternativeSchedule" kan byttes på f.eks. med Fridager.vb-scriptet (eller en vilkårlig annen On/Off virtuell device). Foreløpige begrensninger: Fungerer foreløpig ikke på Zee 1 eller 2. Begrensning i mono gjør at Enums ikke fungerer (visstnok). Jeg kan imidlertid unngå enums med litt omskriving (selv om det er veldig praktisk), så det kommer i en ny versjon. Nedtrekksboksen for manuell temperaturvalg setter ikke "Mode" til "Manual" automatisk (begrensning i scripting, kan ikke, så vidt jeg vet sette opp return CAPI-kall i script). + og - knappene gjør imidlertid dette helt fint. Oppsett 1. Først finn device Ref/IDene til både devicen for temperatursensoren og devicen for av/på bryteren til varmekilden (ovnen?). Device Ref står øverst på "Advanced"-tab'en etter at du har trykket på en device (eller i URLen som dukker opp når du holder musepekeren over linken til devicen). 2. Lag et event som du kaller "Termostat setup" (f.eks), sett trigger til "This Event is manually triggered". Legg til en Action som er "Run a Script", og trykk så på knappen "Edit, og skriv inn "VirtualThermostat.vb" (filnavnet er VELDIG viktig) og trykk OK. 3. Nå kollapser scriptet, så vi utvider det igjen og trykker på det røde flyet : . I scriptboksen (det store blanke feltet med Sub Main.... etc) fjerner du alt og kopierer inn scriptet under: ... og trykk på "Save Script" knappen nederst. HUSK: Trykk på "Save Script" knappen nederst. Gjort det? I "Sub or Function"-boksen skal det stå "Setup". I Parameter skal det stå: HeaterDeviceReference=1139,ExternalTemperatureSensorRef=74 ... der du bytter ut 1139 med dev-ref til av/på-bryteren og 74 med dev-ref til temperatursensoren. Da skal alt se slik ut: 4. Trykk på den blå pilen øverst på eventet for å sette i gang setup-rutinen. Da er vi snart ferdige. 5. Scriptet oppretter et Event (i Event-kategorien "Virtual Thermostat") som kjører scriptet hvert 5. minutt, og det er nesten helt riktig. Vi må bare justere et par ting. Åpne scriptet som ligger under "Virtual Thermostat". Gi det et litt mer beskrivende navn, så er det enklere å finne tilbake. 6. Utvid Run Script action'en, og deaktiver "Only allow a single instance to run at a time" (ellers er det jo bare en termostat som vil fungere) Hvis alt nå er vel, skal det se slik ut: 7. Personlig skrur jeg av logging på slike eventer: 7. ??? 8. Profit! Konfigurasjon I /Config-mappen din har det nå dukket opp en fil som heter "VirtualThermostat_nnn.ini" der nnn er device referansen til root'en (den samme som også navngir eventet over). Den vil se f.eks. slik ut: [Settings] ExternalTemperatureSensorRef=74 TemperatureCorrectionAddition=0 TemperatureCorrectionMultiplier=1 TemperatureOffset=0,3 Log=False HeaterDeviceReference=1139 TemperatureHigh=22 TemperatureLow=19 AlternativeScheduleDeviceReference=0 [Schedule] 6:00=High 8:0=Low 16:00=High 22:00=Low [AlternativeSchedule] 6:00=High 23:00=Low ... der vi kjenner igjen ExternalTemperatureSensorRef og HeaterDeviceReference som de vi satte opp i Setup-rutinen. De andre feltene har følgende forklaring: TemperatureCorrectionAddition=0 er hvor mye som legges til eller trekkes fra den faktiske temperatursensoren. Fint for kalibrering TemperatureCorrectionMultiplier=1 hvor mye temperatursensoren skaleres med fra den faktiske temperatursensoren. Fint for kalibrering. (1 = ingen skalering) TemperatureOffset er hvor langt ned under "Setpoint" temperaturen tillates å bli før varmekilden skrus på. Hvis Setpoint er satt til 22 grader, vil ikke ovnen bli satt på før temperaturen har sunket under 21,7 grader. TemperatureHigh og Low er selvforklarende. AlternativeScheduleDeviceReference er referanse til en enhet som bestemmer om det er "Schedule" eller "AlternativeSchedule" som skal brukes. Schedule og AlternativeSchedule: Her står klokkeslett (i stigende rekkefølge og uten ledende nuller) og tilhørende temperaturer. Med mindre du spesifiserer noe annet, vil kl 0:00 alltid begynne med "Low" temperaturvalg. Så da leser vi Schedule slik: Mellom kl 00 og 06 er det "Low" Mellom kl 6 og 8 er det "High" Mellom 8 og 16 er det "Low" Mellom 16 og 22 er det "High" Og fra 22 og utover er det "Low" Du kan spesifisere din egen temperatur istedenfor "High" og "Low" også, i tilfelle du vil ha en halv grad ekstra om kvelden. Da kan det f.eks. se slik ut: [Schedule] 6:00=High 8:0=Low 16:00=High 20:00=22,5 22:00=Low Pro tip: Du kan også sette opp Eventet til å kjøre på "device change" når temperatursensoren endrer verdi, istedenfor hvert 5. minutt (eller hvor ofte det å passer deg). Da kan det også være lurt å sette opp et par tilleggs-triggere til på bestemte klokkeslett eller andre hendelser, for det er jo ingen garanti at temperaturen endrer seg slik at scriptet trigges. Enjoy!
  9. To scripts som logger verdier til flate tekstfiler, med tidspunktet og verdien eller statusen separert med tab. Kan da enkelt limes inn i f.eks. Excel. LogValueToFile.vb Sub Main(parm As Object) Dim deviceRef As Integer = parm.ToString() Dim out As String = Now.ToShortDateString & " " & Now.ToLongTimeString & vbTab & hs.DeviceValueEx(deviceRef).ToString("f1") Try My.Computer.FileSystem.WriteAllText(hs.GetAppPath & "\Logs\" & deviceRef & ".txt", out & vbNewLine, True) Catch ex As Exception hs.WriteLog("LogValueToFile ERROR", ex.Message) End Try End Sub Å hente status kan være verre, for det er flere måter å gjøre det på. LogStatusToFile.vb Sub Main(parm As Object) Dim deviceRef As Integer = parm.ToString() Dim out As String = Now.ToShortDateString & " " & Now.ToLongTimeString & vbTab & GetDeviceString(deviceRef) Try My.Computer.FileSystem.WriteAllText(hs.GetAppPath & "\Logs\" & deviceRef & ".txt", out & vbNewLine, True) Catch ex As Exception hs.WriteLog("LogStatusToFile ERROR", ex.Message) End Try End Sub Function GetDeviceString(ByVal DeviceRef As Integer) As String 'Henter device string fra HS Dim devstring As String = hs.DeviceString(DeviceRef) If devstring <> String.Empty Then Return devstring 'Henter devicestring directe fra CAPI-status, hvis den finnes devstring = hs.CAPIGetStatus(DeviceRef).Status If devstring <> String.Empty Then Return devstring 'Henter devicestring fra CAPI beskrivelse (basert på value) devstring = GetCapiString(DeviceRef) If devstring <> String.Empty Then Return devstring 'Henter devicestring fra device class Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(DeviceRef) devstring = dev.devString(Nothing) If devstring <> String.Empty Then Return devstring Return "String not found for " & DeviceRef & ", value = " & hs.DeviceValueEx(DeviceRef) End Function Function GetCapiString(ByVal DeviceRef As Integer) As String For Each CAPI As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(DeviceRef) If CAPI.ControlValue = hs.DeviceValue(DeviceRef) Then Return CAPI.Label.ToString Next Return String.Empty End Function Kalles med device Ref som parameter.
  10. Jeg har lurt litt på hvordan jeg kan bruke RGB-lys og en MiCube fra Xiaomi (lett integrerbart i HomeSeer med deCONZ/JowiHue). Har laget et par scripts til det. Se bloggen for en video. Det første justerer lysstyrken med å vri på kuben. Hvilket farge (eller lys) den styrer er avhengig av hvilken side som vender opp. Settes opp slik: ... og i eksempelet over er 2566 er rotasjon-devicen, 2565 er side-devicen. 900, 901 og 902 er devicer for hhv. rød, grønn og blå. Den oppmerksomme leser vil legge merke til at det er mulig å styre flere lys samtidig (greenID1+greenID2+....). F.eks. ville 990+1045+1077 styre tre forskjellige lys. Praktisk hvis man har flere RGB-lenker i samme rom. Jeg bruker den muligheten i stua. MiCube_RGB.vb Du trenger selvfølgelig ikke bruke rød, grønn og blå, du kan bruke andre devicer så lenge de bruker vanlige 0-99-nivåer. Med en liten endring kan du styre opp til 6 forskjellige lys fra en kube. Det andre scriptet skal skru av og på med et "dobbelt tap", men kan også brukes til å styre noe når siden flippes over. Her trengs kun side-rotasjonen, men har et ekstra tillegg for å skru av alle lys. Device 989 er "all colors" på en Fibaro RGBW modul. MiCube_side.vb
  11. 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 (ny) Public Sub Main(ByVal input As Object) Dim logDeviceRef As Integer = 1081 ' Update this Dim count As Integer = 9 'Maximum number of lines shown on the device - 1. 9 means 10 lines are shown Dim currentText As String = hs.DeviceString(logDeviceRef) currentText = currentText.Replace("<br>", "|") Dim lines() As String = currentText.Split("|") If lines.GetLength(0) < count Then count = lines.GetLength(0) Dim oldLines(count - 1) As String Array.Copy(lines, oldLines, count) 'Creating the device text Dim newText As String = Now.Date & " " & Now.ToLongTimeString & " - " & input.ToString If lines.GetLength(0) > 0 And lines(0) <> "" Then newText &= "<br>" 'Adding the previous lines newText &= String.Join("<br>", oldLines) 'Updating the device string hs.SetDeviceString(logDeviceRef, newText, True) 'hs.TriggerEvent("Restart SisteBeveglse timer") lines = Nothing oldLines = Nothing 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. EDIT2: Bruker arrays for å gjøre scriptet enklere. Burde nå kjøre på Linux uten problemer.
  12. Å vite om det er helg eller ikke er ganske praktisk for hjemmeautomasjon. De aller fleste har andre rutiner i helgene enn de har i ukedagene. Hos oss er derimot rutinene for fridager omtrent prikk lik dager i helgen, så det hadde jo vært praktisk om man istedenfor å sjekke om det er helg, kunne sjekke om det er en fridag. Og nå kan vi det. Basert på @xibriz sitt glimrende PHP-script for å sjekke for offentlige høytider (og omskrevet til VB.NET) har jeg lagt til en rutine ekstra, som bl.a. sjekke om det faktisk er helg eller om det er noen andre unntak lagt inn. Du trenger en virtuell device med "Control Use" for Off og On definert (under Status Grapics -> Status-kolonne). Her er min: Device Ref til denne brukes som parameter i scriptet. Scriptet trigges ved midnatt hver dag for å sjekke om dagen i dager en fridag eller ei. Fridager.vb Sub Main(ByVal deviceReference As String) 'Moskus 2017 Dim devRef As Integer = Integer.Parse(deviceReference.ToString) Dim isCurrentDateHoliday As Boolean = False If Not isCurrentDateHoliday Then isCurrentDateHoliday = IsOfficialHoliday(Now) 'Sjekker offisielle helligdager If Not isCurrentDateHoliday Then isCurrentDateHoliday = IsCustomHoliday(Now) 'Sjekker egen-spesifiserte dager If isCurrentDateHoliday Then hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._On)) Else hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._Off)) End If End Sub Public Function IsCustomHoliday(ByVal _date As Date) As Boolean _date = _date.Date 'In case time was added 'For eksempel sjekkeom det er en lørdag eller søndag If _date.DayOfWeek = DayOfWeek.Saturday Then Return True If _date.DayOfWeek = DayOfWeek.Sunday Then Return True 'Jeg har alltid fri i romjulen If _date.Month = 12 Then If _date.Day >= 27 AndAlso _date.Day <= 31 Then Return True End If End If 'Andre spesifikke dager kan legges i listen, f.eks. har barnehagen planleggingsdager Dim dateList As New System.Collections.Generic.List(Of Date) dateList.Add(New Date(2017, 4, 18)) If dateList.Contains(_date) Then Return True 'Har vi kommet så langt er det ingen fridager, returner "False" Return False End Function Public Function IsOfficialHoliday(ByVal _date As Date) As Boolean 'translated php script form xibriz: https://www.diskusjon.no/index.php?showtopic=1084239 _date = _date.Date 'in case time was added Dim easterDate As Date = GetEasterDate(_date.Year) 'Sjekker om datoen er 1. Januar If _date = New Date(_date.Year, 1, 1) Then Return True 'Sjekker om datoen er pamlesøndag (1. påskedag - 7 dager) If _date = easterDate.AddDays(-7) Then Return True 'Sjekker om datoen er skjærtorsdag (1. påskedag - 3 dager) If _date = easterDate.AddDays(-3) Then Return True 'Sjekker om datoen er langfredag (1. påskedag - 2 dager) If _date = easterDate.AddDays(-2) Then Return True 'Sjekker om datoen er 1. påskedag If _date = easterDate Then Return True 'Sjekker om datoen er 2. påskedag (1. påskedag + 1 dag) If _date = easterDate.AddDays(1) Then Return True 'Sjekker om datoen er 1. mai (offentlig høytidsdag) If _date = New Date(_date.Year, 5, 1) Then Return True 'Sjekker om datoen er 17. mai (grunnlovsdag) If _date = New Date(_date.Year, 5, 17) Then Return True 'Sjekker om datoen er kristi himmelfartsdag (40. påskedag) If _date = easterDate.AddDays(39) Then Return True 'Sjekker om datoen er 1. pinsedag (50. påskedag) If _date = easterDate.AddDays(49) Then Return True 'Sjekker om datoen er 2 pinsedag (51. påskedag) If _date = easterDate.AddDays(50) Then Return True 'Sjekker om datoen er 1. juledag (25. desember) If _date = New Date(_date.Year, 12, 25) Then Return True 'Sjekker om datoen er 2 juledag (26. desember) If _date = New Date(_date.Year, 12, 26) Then Return True Return False End Function Public Function GetEasterDate(ByVal Year As Integer) As Date 'Originally taken from: http://www.thoughtproject.com/Snippets/Easter/Easter.vb.txt Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim e As Integer Dim f As Integer Dim g As Integer Dim h As Integer Dim i As Integer Dim k As Integer Dim l As Integer Dim m As Integer Dim n As Integer Dim p As Integer If Year < 1583 Then Return Nothing Else ' Step 1: Divide the year by 19 and store the ' remainder in variable A. Example: If the year ' is 2000, then A is initialized to 5. a = Year Mod 19 ' Step 2: Divide the year by 100. Store the integer ' result in B and the remainder in C. b = Year \ 100 c = Year Mod 100 ' Step 3: Divide B (calculated above). Store the ' integer result in D and the remainder in E. d = b \ 4 e = b Mod 4 ' Step 4: Divide (b+8)/25 and store the integer ' portion of the result in F. f = (b + 8) \ 25 ' Step 5: Divide (b-f+1)/3 and store the integer ' portion of the result in G. g = (b - f + 1) \ 3 ' Step 6: Divide (19a+b-d-g+15)/30 and store the ' remainder of the result in H. h = (19 * a + b - d - g + 15) Mod 30 ' Step 7: Divide C by 4. Store the integer result ' in I and the remainder in K. i = c \ 4 k = c Mod 4 ' Step 8: Divide (32+2e+2i-h-k) by 7. Store the ' remainder of the result in L. l = (32 + 2 * e + 2 * i - h - k) Mod 7 ' Step 9: Divide (a + 11h + 22l) by 451 and ' store the integer portion of the result in M. m = (a + 11 * h + 22 * l) \ 451 ' Step 10: Divide (h + l - 7m + 114) by 31. Store ' the integer portion of the result in N and the ' remainder in P. n = (h + l - 7 * m + 114) \ 31 p = (h + l - 7 * m + 114) Mod 31 ' At this point p+1 is the day on which Easter falls. ' n is 3 for March or 4 for April. Return DateSerial(Year, n, p + 1) End If End Function Merk: Det kan være du vil fjerne noen linjer i scriptet eller i det minste kommentere dem ut. Det er f.eks. ikke sikkert at du har fri uka etter påske: dateList.Add(New Date(2017, 4, 18)) ... og hvis ikke, kan du fjerne denne linjen. Det er heller ikke sikkert du har fri romjulen, så da bør du fjerne dette: If _date.Month = 12 Then If _date.Day >= 27 AndAlso _date.Day <= 31 Then Return True End If End If Du kan også selvfølgelig legge til dine egne unntak for arbeidsdager hvis du ønsker det. Har du fri hver fredag, så kan du jo bare legge det til. Jeg har nå byttet ut alle sjekker på om det er helg eller ikke til å sjekke om "Fridag" er på eller ikke. Når jeg tenker meg om tror jeg at jeg skal sette "On" til å være "Fridag" og "Off" til å være "Arbeidsdag". Som sagt; så gjort: ... som da blir slik: EDIT: 17. mai var satt til å være 17.01 istedenfor 17.05. Korrigert. Versjon med to devicer, en for dagen i dag og en for dagen i morgen:
  13. Dette scriptet brukes f.eks. hvis du vil øke lyset gradvis fra 0% til 100% over en halv time. Da trenger du et script som trigger hvert 18. sekund, og som kjører dette scriptet: IncrementLight.vb Public Sub Main(ByVal _deviceRef As Object) '© Moskus Dim deviceRef As Integer = Integer.Parse(_deviceRef) Dim deviceValue As Integer = hs.DeviceValue(deviceRef) 'Exit if the device is already at maximum, i.e. "On" If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef) If cc.ControlValue = (deviceValue + 1) Then 'Set the correct dim level hs.CAPIControlHandler(cc) 'We're done, so let's exit! Exit Sub End If Next End Sub IncrementLightCustom.vb Ulempen med de fleste dimmere er at de ikke er lineære. De første 1-20% gir en mye større relativt forskjell enn de siste 80-99%. Det gjør det følgende scriptet med, men du trenger en "counter" som må settes til 0 før du starter. Parameter: 100#counter name ... der 100 er device ref til lampen du skal styre, og "counter name" selvfølgelig er navnet på counteren. Public Sub Main(ByVal _deviceRefAndCounter As Object) '© Moskus Dim deviceRef As Integer = Integer.Parse(_deviceRefAndCounter.ToString.Split("#")(0)) Dim countervalue As Integer = hs.CounterValue(_deviceRefAndCounter.ToString.Split("#")(1)) Dim modifier As Integer = 4 Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1)) 'Exit if the device is already at maximum, i.e. "On" If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef) If cc.ControlValue = dimvalue Then 'Set the correct dim levelQ hs.CAPIControlHandler(cc) 'We're done, so let's exit! Exit Sub End If Next End Sub IncrementLightRGB.vb Hvis man istedenfor har en RGB-stripe eller lampe, og man først vil ha lyset rødt, så gult, og deretter hvitt, kan man bruke dette. Du må endre de fire første linjene for å passe til ditt oppsett. Public Sub Main(ByVal _nothingreally As Object) '© Moskus Dim deviceR As Integer = 990 Dim deviceG As Integer = 991 Dim deviceB As Integer = 992 Dim countervalue As Integer = hs.CounterValue("Sunshine soverom") Dim modifier As Integer = 2 Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1)) 'Exit if the device is already at maximum, i.e. "On" 'If hs.CAPIGetStatus(deviceR).Status = "On" Then Exit Sub 'Red If countervalue <= 100 Then 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceR) If cc.ControlValue = dimvalue Then If hs.CAPIGetStatus(deviceR).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If 'Green If countervalue > 100 AndAlso countervalue <= 200 Then For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceG) If cc.ControlValue = countervalue - 100 Then If hs.CAPIGetStatus(deviceG).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If If countervalue = 150 Then Dim capi As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(deviceB, True, "off", False, False) hs.CAPIControlHandler(capi) End If 'Blue If countervalue > 150 Then For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceB) If cc.ControlValue = countervalue - 150 Then If hs.CAPIGetStatus(deviceB).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If End Sub Generelt oppsett av eventer:
  14. Hei. Jeg har laget et script for å starte og parkere Gardena Smart Sileno gressklippere. Testet og fungerer på min Gardena Smart Sileno R100Li. Legg inn e-postadressen, passordet, og navnet på klipperen på linje 12->14 i skriptet. Sett logJson = True for å se alt i json-responsen fra Gardena. Det ligger mye nyttig informasjon i responsen fra get_device_id. Kall scriptet med parameter start eller stop. Disse parametrene blir så brukt lenger nede i scriptet til: 'Available start commands: 'Start according to schedule: "{""name"":""start_resume_schedule"", ""parameters"":{}}" 'Start overriding schedule. Run for 1440 minutes: "{""name"":""start_override_timer"", ""parameters"":{""duration"": 1440}}" 'Available stop commands: 'Park and pause all schedules: "{""name"":""park_until_further_notice""}" 'Park and start again at next schedule: "{""name"":""park_until_next_timer""}" Imports System.IO Imports System.Net '*** Choose if json-responces should get written to the log *** Const logJson As Boolean = False '************************************************************** Public Sub Main(ByVal command As String) '*** Put in e-mailadress and password and lawnmover-name *** '*** They must be exactly as entered into the Gardena app *** Dim email As String = "myemail@gmail.com" Dim password As String = "Mypassword" Dim mower_name As String = "Name_of_lawnmower_in_gardena_app" '************************************************* '*** NO NEED TO EDIT BEHIND THIS POINT! *** '************************************************* 'Get token and username Dim jsonGetToken As String = "{""sessions"":{""email"":""" & email & """,""password"":""" & password & """}}" Dim tokenAndUser() As String = getToken(jsonGetToken) 'Get location Dim location As String = getLocation(tokenAndUser) 'Get device-id for lawnmover set in mower_name Dim locationAndToken(3) as String locationAndToken(0) = tokenAndUser(0) locationAndToken(1) = location locationAndToken(2) = mower_name Dim deviceId As String = getdeviceId(locationAndToken) 'Send start or stop command to mower Dim data(4) as String data(0) = tokenAndUser(0) data(1) = location data(2) = deviceId data(3) = command sendCommand(data) End Sub Public Function getToken(json As string) As String() 'Get token and user ID based on e-mail and password Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/sessions" Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim encoding As New System.Text.UTF8Encoding Dim sr As StreamReader Dim result(2) As String Try Dim data As Byte() = encoding.GetBytes(json) myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.ContentLength = data.Length myWebReq.Method = "POST" Dim myStream As Stream = myWebReq.GetRequestStream() If data.Length > 0 Then myStream.Write(data, 0, data.Length) myStream.Close() End If myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getToken: " & responseText) End If 'Search json for token Dim sSource As String = responseText 'String that is being searched Dim sDelimStart As String = """token"":""" 'First delimiting word Dim sDelimEnd As String = """,""user_id" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim token As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "Token: " & token) 'We got the token, continue to get the user id sDelimStart = "user_id"":""" 'First delimiting word sDelimEnd = """,""refresh_token" 'Second delimiting word nIndexStart = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 nIndexEnd = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim user As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "User: " & user) result(0) = token result(1) = user return result Else hs.WriteLog("Gardena", "Error: Did not receive user ID") End If Else hs.WriteLog("Gardena", "Error: Did not receive token") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function getLocation(tokenAndUser() As String) As String 'Get location based on token and user id Dim token As String = tokenAndUser(0) Dim user As String = tokenAndUser(1) Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=" & user Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim sr As StreamReader Try myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.Method = "GET" myWebReq.Headers.Add("X-session", token) myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getLocation: " & responseText) End if 'Search json for location Dim sSource As String = responseText 'String that is being searched Dim sDelimStart As String = """id"":""" 'First delimiting word Dim sDelimEnd As String = """,""name" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimStart) 'Find the first occurrence of f1 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim location As String = Strings.Mid(sSource, nIndexStart + sDelimStart.Length + 1, nIndexEnd - nIndexStart - sDelimStart.Length) 'Crop the text between hs.WriteLog("Gardena", "Location: " & location) return location Else hs.WriteLog("Gardena", "Error: Did not receive location") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function getdeviceId(tokenAndLocation() As String) As String 'Get device id for lawnmover based on location and mower_name Dim token As String = tokenAndLocation(0) Dim location As String = tokenAndLocation(1) Dim mower_name As String = tokenAndLocation(2) Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=" & location Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim sr As StreamReader Try myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.Method = "GET" myWebReq.Headers.Add("X-session", token) myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() if logJson Then hs.WriteLog("Gardena", "Response getLocation: " & responseText) End If 'Finn Device ID Dim sSource As String = responseText 'String that is being searched Dim sDelimEnd As String = """,""name"":""" & mower_name & """,""category"":""mower""" 'Second delimiting word Dim nIndexStart As Integer = sSource.IndexOf(sDelimEnd) - 36 Dim nIndexEnd As Integer = sSource.IndexOf(sDelimEnd) 'Find the first occurrence of f2 If nIndexStart > -1 AndAlso nIndexEnd > -1 Then '-1 means the word was not found. Dim deviceId As String = Strings.Mid(sSource, nIndexStart + 1, nIndexEnd - nIndexStart) 'Crop the text between hs.WriteLog("Gardena", "Device ID: " & deviceId) return deviceId Else hs.WriteLog("Gardena", "Error: Did not receive device ID") End If Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function Public Function sendCommand(data() As String) 'Send start or stop to the mower. Dim token As String = data(0) Dim location As String = data(1) Dim device As String = data(2) Dim command As String = data(3) Dim json As String '*** Here you can change what start and stop does.*** 'Available start commands: 'Start according to schedule: "{""name"":""start_resume_schedule"", ""parameters"":{}}" 'Start overriding schedule. Run for 1440 minutes: "{""name"":""start_override_timer"", ""parameters"":{""duration"": 1440}}" 'Available stop commands: 'Park and pause all schedules: "{""name"":""park_until_further_notice""}" 'Park and start again at next schedule: "{""name"":""park_until_next_timer""}" if command = "start" Then json = "{""name"":""start_resume_schedule"", ""parameters"":{}}" else if command = "stop" Then json = "{""name"":""park_until_further_notice""}" else hs.writelog("Gardena", "Error: Angi start eller stop som parameter") End If Dim strURL As String = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/" & device & "/abilities/mower/command?locationId=" & location Dim myWebReq As HttpWebRequest Dim myWebResp As HttpWebResponse Dim encoding As New System.Text.UTF8Encoding Dim sr As StreamReader Try Dim data As Byte() = encoding.GetBytes(json) myWebReq = DirectCast(WebRequest.Create(strURL), HttpWebRequest) myWebReq.ContentType = "application/json" myWebReq.ContentLength = data.Length myWebReq.Headers.Add("X-session", token) myWebReq.Method = "POST" Dim myStream As Stream = myWebReq.GetRequestStream() If data.Length > 0 Then myStream.Write(data, 0, data.Length) myStream.Close() End If myWebResp = DirectCast(myWebReq.GetResponse(), HttpWebResponse) sr = New StreamReader(myWebResp.GetResponseStream()) Dim responseText As String = sr.ReadToEnd() hs.WriteLog("Gardena", "Sent command: " & command) Catch ex As Exception : hs.writelog("Gardena", "Error: " & ex.Message.ToString) End Try End Function
  15. Hei, har nettopp startet med homeseer og ønsker å lage noen enkle skript i c#. Men det er vist ikke like enkelt... Scenario: Har skrevet data til en influxdb og vil lese disse igjen (med en mean aggregering). Problemet er at jeg vil bruke Newtonsoft.Json.Net til å parse JSON resultatet. See hele koden under. Problemet er hvordan refererer jeg til Newtonsoft.Json.dll? I følge dokumentasjonen jeg fant her (under c# scripting) så står det: Så det gjorde jeg... Jeg ser at Newtonsoft.Json.dll ligger i bin\Homeseer folderen og tenkte der for at det ikke var nødvending å legge til noe path. Har prøvd mye men får feil hele tiden. Det virker ikke som //css_reference har noen effekt. Kode: //css_reference Newtonsoft.Json.dll; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public object Main(object param) { var sensitivity = double.Parse((string)param); var deviceId = 271; var INFLUX_DB_SERVER_IP = "10.0.0.104"; var INFLUX_DB_SERVER_PORT = "8086"; var INFLUX_DB_DATABASE_NAME = "homeseer"; var query = "q=select mean(value) from Downstairs_Bathroom_Humidity where time > now() - 1d"; var url = "http://" + INFLUX_DB_SERVER_IP + ":" + INFLUX_DB_SERVER_PORT + @"/query?db=" + INFLUX_DB_DATABASE_NAME; var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; try { request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var data = System.Text.Encoding.ASCII.GetBytes(query); request.ContentLength = data.Length; request.Timeout = 5000; var stream = request.GetRequestStream(); try { stream.Write(data, 0, data.Length); } finally { stream.Close(); } var response = (System.Net.HttpWebResponse)request.GetResponse(); var responseString = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd(); var result = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString); var meanValue = (double) ((Newtonsoft.Json.Linq.JValue)((Newtonsoft.Json.Linq.JContainer)result)["results"].First["series"].First["values"].First.Last).Value; var value = hs.DeviceValue(deviceId); if((value - sensitivity) > meanValue) { hs.TriggerEvent("Run Ventilator for 10 minuttes"); hs.WriteLog("Julius-Ventilation", "Info: Triggered Ventilation"); } } catch (System.Exception ex) { hs.WriteLog("Julius-Ventilation", "Error: " + ex.Message); } return 0; } Feil medling: Compiling script C:\Program Files (x86)\HomeSeer HS3\scripts\CSharpTest.cs: {interactive}(93,30): error CS0103: The name `Newtonsoft' does not exist in the current context {interactive}(93,41): error CS0023: The `.' operator cannot be applied to operand of type `' {interactive}(93,17): error CS0825: The contextual keyword `var' may only appear within a local variable declaration {interactive}(95,106): error CS0841: A local variable `result' cannot be used before it is declared {interactive}(95,74): error CS0246: The type or namespace name `Newtonsoft' could not be found. Are you missing a using directive or an assembly reference? {interactive}(95,17): error CS0825: The contextual keyword `var' may only appear within a local variable declaration {interactive}(101,44): error CS0841: A local variable `meanValue' cannot be used before it is declared {interactive}(11,17): warning CS0414: The private field `Script.hs' is assigned but its value is never used
  16. Scriptet er basert på @Moskus sitt "Fridager.vb": Tar derfor bare "kortversjonen" av oppsettet her: * Lag en virtuell device "Flaggdag" med verdiene "Ja" (On) og "Nei" (Off) * Noter deg devID * Lag "Flaggdag.vb": Sub Main(ByVal deviceReference As String) 'Moskus 2017 Dim devRef As Integer = Integer.Parse(deviceReference.ToString) Dim isCurrentDateFlagday As Boolean = IsFlagday(Now) If isCurrentDateFlagday Then hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._On)) Else hs.CAPIControlHandler(hs.CAPIGetSingleControlByUse(devRef, HomeSeerAPI.ePairControlUse._Off)) End If End Sub Public Function IsFlagday(ByVal _date As Date) As Boolean 'translated php script form xibriz: https://www.diskusjon.no/index.php?showtopic=1084239 _date = _date.Date 'in case time was added Dim easterDate As Date = GetEasterDate(_date.Year) 'Sjekker om datoen er 1. Januar If _date = New Date(_date.Year, 1, 1) Then Return True 'Sjekker om datoen er 21. Januar (Prinsesse Ingrid Alexandra) If _date = New Date(_date.Year, 1, 21) Then Return True 'Sjekker om datoen er 6. februar (samefolkets dag) If _date = New Date(_date.Year, 2, 6) Then Return True 'Sjekker om datoen er 21. februar (Kong Haralds bursdag) If _date = New Date(_date.Year, 2, 21) Then Return True 'Sjekker om datoen er 1. påskedag If _date = easterDate Then Return True 'Sjekker om datoen er 1. mai (offentlig høytidsdag) If _date = New Date(_date.Year, 5, 1) Then Return True 'Sjekker om datoen er 8. mai (frigjøringsdag) If _date = New Date(_date.Year, 5, 8) Then Return True 'Sjekker om datoen er 17. mai (grunnlovsdag) If _date = New Date(_date.Year, 5, 17) Then Return True 'Sjekker om datoen er 7. juni (unionsoppløsning) If _date = New Date(_date.Year, 6, 7) Then Return True 'Sjekker om datoen er 1. pinsedag (50. påskedag) If _date = easterDate.AddDays(49) Then Return True 'Sjekker om datoen er 4. juli (Dronning Sonja) If _date = New Date(_date.Year, 7, 4) Then Return True 'Sjekker om datoen er 20. juli (Kronprins Haakon) If _date = New Date(_date.Year, 7, 20) Then Return True 'Sjekker om datoen er 29. juli (Olsok) If _date = New Date(_date.Year, 7, 29) Then Return True 'Sjekker om datoen er 19. august (Mette-Marit) If _date = New Date(_date.Year, 8, 19) Then Return True 'Sjekker om datoen er 1. juledag (25. desember) If _date = New Date(_date.Year, 12, 25) Then Return True Return False End Function Public Function GetEasterDate(ByVal Year As Integer) As Date 'Originally taken from: http://www.thoughtproject.com/Snippets/Easter/Easter.vb.txt Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim e As Integer Dim f As Integer Dim g As Integer Dim h As Integer Dim i As Integer Dim k As Integer Dim l As Integer Dim m As Integer Dim n As Integer Dim p As Integer If Year < 1583 Then Return Nothing Else ' Step 1: Divide the year by 19 and store the ' remainder in variable A. Example: If the year ' is 2000, then A is initialized to 5. a = Year Mod 19 ' Step 2: Divide the year by 100. Store the integer ' result in B and the remainder in C. b = Year \ 100 c = Year Mod 100 ' Step 3: Divide B (calculated above). Store the ' integer result in D and the remainder in E. d = b \ 4 e = b Mod 4 ' Step 4: Divide (b+8)/25 and store the integer ' portion of the result in F. f = (b + 8) \ 25 ' Step 5: Divide (b-f+1)/3 and store the integer ' portion of the result in G. g = (b - f + 1) \ 3 ' Step 6: Divide (19a+b-d-g+15)/30 and store the ' remainder of the result in H. h = (19 * a + b - d - g + 15) Mod 30 ' Step 7: Divide C by 4. Store the integer result ' in I and the remainder in K. i = c \ 4 k = c Mod 4 ' Step 8: Divide (32+2e+2i-h-k) by 7. Store the ' remainder of the result in L. l = (32 + 2 * e + 2 * i - h - k) Mod 7 ' Step 9: Divide (a + 11h + 22l) by 451 and ' store the integer portion of the result in M. m = (a + 11 * h + 22 * l) \ 451 ' Step 10: Divide (h + l - 7m + 114) by 31. Store ' the integer portion of the result in N and the ' remainder in P. n = (h + l - 7 * m + 114) \ 31 p = (h + l - 7 * m + 114) Mod 31 ' At this point p+1 is the day on which Easter falls. ' n is 3 for March or 4 for April. Return DateSerial(Year, n, p + 1) End If End Function * Lag disse eventene: (parameters er devID til devicen du laget) Påminnelse om å flagge: (jeg bruker et script som sender meg pushvarsel via Pushover, hvis jeg er hjemme, men du kan bruke hva du vil som "action") Påminnelse om å ta ned: Her er "cannot re-run for" en fordel, for man skal ta ned flagget enten kl 2100 eller ved solnedgang. Ønsker ikke påminnelse på begge de tidspunktene.
  17. mpdei

    Trinnvis belysning av trapp

    Jeg ønsker å få til trinnvis belysning av trappetrinn på samme måte som her: https://kreativbelysning.no/butikk/trappebelysning/automatisk-trappebelysning Tenker følgende: - Bevegelsesdetektor i topp og bunn - 4 stk Fibaro rgbw hvor hver utgang er koblet til ett trinn - Lage et script som styrer rekkefølgen og tidsintervall på når hvert trinn tennes (hsp.WaitMS?) Utfordringen er at jeg aldri har laget et script før, og vet knapt nok hvordan det fungerer. Så mitt spørsmål er: hvordan skal et slikt script skrives? Setter stor pris på tips i riktig retning
  18. 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 =)
  19. EDIT: Ny versjon av scriptet, nå med mulighet for å sende med info fra en device i meldingen! Skrevet for IFTTT, men kan jo enkelt endres til hva som helst. Formål: Send pushvarsel til meg, samboer eller begge og evt bare hvis vi er hjemme/borte. Se scriptet: Guide for bruk: Først, registrer konto på IFTTT.com for begge brukere og last ned IFTTT-appen på telefonene til begge brukere. Lag en "applet" med "Maker" som "This", den skal ha "event name" satt som "notify". "That" skal fortsatt være "Notification", men den skal ha "{{Value1}}" som innhold (settes inn via "ingredient"-knappen). I scriptet må man legge inn API-key for begge brukere. Det er siste del av URL man finner her: https://ifttt.com/services/maker/settings I HomeSeer trenger du 2 devicer som sier om hver av dere er hjemme eller ikke. Jeg bruker PHLocation-plugin og har satt opp "home location": Da får man en device hver som er enten "Near" eller "Not near" "hjemme": I scriptet må man sette IDen til "near"-devicene. "isHomeValue" settes til "1" og "isAwayValue settes til "0" hvis man bruker PHLocation ("Near" er verdi 1 og "Not near" er verdi 0). Eksempel: Parameter her er: "3|0|Warning: %name% is at %value%!|300" Det vil føre til at jeg får varsel uansett, hun vil ikke motta varsel og teksten vil være "Warning: %name% is at %value%!" (hvis device 300 er en temp.sensor, så kan teksten bli f.eks: "Warning: Fryser is at -5!".
  20. 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("&nbsp;", "").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
  21. 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) -->
  22. GrandbeingMX0404.vb Script for å styre en Grandbeing MX0404 HDMI matrise. Lager en root med tilhørende child-devicer for hver utgang hvor man kan trykke på de forskjellige inngangene. Alt i et script, men dette blir nok en plugin på sikt (der er det lettere å få til en autorefresh, og sånt). '© Moskus 2014 Dim Scriptname As String = "GrandbeingMX0404.vb" Dim hdmi_outputs() As String = {"None", "TV", "SageTV", "Xbox", "Extra"} Dim ip_address As String = "192.168.0.39" Public Sub Main(parm As Object) End Sub Public Sub Setup(parm As Object) 'Setting up devices 'Creating master device Dim dt As New HomeSeerAPI.DeviceTypeInfo Dim devref As Integer = hs.NewDeviceRef("Root") Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref) Try dv.Location(hs) = "HDMI matrix" dv.Location2(hs) = "Media" dv.Device_Type_String(hs) = "HDMI root" dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo dv.Status_Support(hs) = True dv.Can_Dim(hs) = False hs.SaveEventsDevices() dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) 'Adding a "Refresh" button to the root device hs.DeviceScriptButton_AddButton(devref, "Refresh", 0, Scriptname, "ButtonPress", "Refresh", 1, 1, 1) hs.SaveEventsDevices() Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status) SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue SVpair.Value = 0 SVpair.Status = "HDMI matrix" hs.DeviceVSP_AddPair(devref, SVpair) Dim VGpair As New HomeSeerAPI.VGPair VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue VGpair.Set_Value = 0 VGpair.Graphic = "images/Moskus/icon_hdmi.png" hs.DeviceVGP_AddPair(devref, VGpair) hs.WriteLog("HDMI matrix", "Root device for HDMI matrix created") Catch ex As Exception hs.WriteLog("HDMI matrix", "Error creating root device: " & ex.Message) End Try 'Creating child devices dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root For i As Integer = 1 To 4 Dim childref As Integer = CreateOutputDevice(i, devref) If childref > 0 Then dv.AssociatedDevice_Add(hs, childref) Next End Sub Public Function CreateOutputDevice(ByVal output As Integer, masterdevice As Integer) As Integer 'Creating device Dim dt As New HomeSeerAPI.DeviceTypeInfo Dim devref As Integer = hs.NewDeviceRef("Output " & output) Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devref) Try dv.Location(hs) = "HDMI matrix" dv.Location2(hs) = "Media" dv.Device_Type_String(hs) = "HDMI out " & output dv.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo hs.SaveEventsDevices() dv.Status_Support(hs) = True dv.Can_Dim(hs) = False dv.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) dv.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) dv.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child dv.AssociatedDevice_Add(hs, masterdevice) dv = Nothing hs.WriteLog("HDMI matrix", "Test Device for output " & output & " created") Catch ex As Exception hs.WriteLog("HDMI matrix", "Error creating devices: " & ex.Message) Return 0 End Try Dim SVpair_off As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status) SVpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue SVpair_off.Value = 0 SVpair_off.Status = "None" hs.DeviceVSP_AddPair(devref, SVpair_off) Dim VGpair_off As New HomeSeerAPI.VGPair VGpair_off.PairType = HomeSeerAPI.VSVGPairType.SingleValue VGpair_off.Set_Value = 0 VGpair_off.Graphic = "images/Moskus/icon_hdmi_X.png" hs.DeviceVGP_AddPair(devref, VGpair_off) 'Adding buttons, values and graphic For i As Integer = 1 To 4 hs.DeviceScriptButton_AddButton(devref, output & "-" & i, i, Scriptname, "ButtonPress", output & "-" & i, 1, i, 1) Dim SVpair As New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status) SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue SVpair.Value = i SVpair.Status = "Input " & i hs.DeviceVSP_AddPair(devref, SVpair) Dim VGpair As New HomeSeerAPI.VGPair VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue VGpair.Set_Value = i VGpair.Graphic = "images/Moskus/icon_hdmi_" & i & ".png" hs.DeviceVGP_AddPair(devref, VGpair) Next Return devref End Function Public Sub ButtonPress(Input As Object) Dim devref As Integer = Input(0) Dim ButtonName As String = Input(1) Dim output As String = String.Empty 'Gets filled by GetURLIE Dim device As Integer = 0 Dim master As Integer = hs.GetDeviceParentRefByRef(devref) If master = 0 Then master = devref Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master) For Each devid As Integer In dv.AssociatedDevices(hs) Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid) Select Case dev.Device_Type_String(hs) Case Is = "HDMI root" device = 0 Case Is = "HDMI out 1" device = 1 Case Is = "HDMI out 2" device = 2 Case Is = "HDMI out 3" device = 3 Case Is = "HDMI out 4" End Select Next Dim command As String = "Refresh" If device > 0 Then Dim value As Integer = hdmi_outputs.ToList.IndexOf(ButtonName) command = device & "-" & value End If Select Case command Case Is = "Refresh" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=refrash", True) '"refrash" is actually not a typo on my part... Case Is = "1-1" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a09", True) Case Is = "1-2" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1D", True) Case Is = "1-3" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a1F", True) Case Is = "1-4" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0D", True) Case Is = "2-1" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a17", True) Case Is = "2-2" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a12", True) Case Is = "2-3" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a59", True) Case Is = "2-4" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a08", True) Case Is = "3-1" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a5E", True) Case Is = "3-2" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a06", True) Case Is = "3-3" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a05", True) Case Is = "3-4" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a03", True) Case Is = "4-1" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a18", True) Case Is = "4-2" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a44", True) Case Is = "4-3" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a0F", True) Case Is = "4-4" output = hs.GetURLIE("http://" & ip_address & "/get_data?type=port&cmd=a51", True) End Select InterpretOutput(devref, output) End Sub Public Sub InterpretOutput(ByVal devref As Integer, ByVal output As String) 'output: Output1=1Output2=1Output3=1Output4=1 Dim data(3) As Integer data(0) = CInt(output(8).ToString) data(1) = CInt(output(17).ToString) data(2) = CInt(output(26).ToString) data(3) = CInt(output(35).ToString) Dim master As Integer = hs.GetDeviceParentRefByRef(devref) If master = 0 Then master = devref Dim dv As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(master) For Each devid As Integer In dv.AssociatedDevices(hs) Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(devid) Select Case dev.Device_Type_String(hs) Case Is = "HDMI out 1" If hs.DeviceValue(devid) <> data(0) Then hs.SetDeviceValueByRef(devid, data(0), True) Else hs.SetDeviceValueByRef(devid, data(0), False) End If Case Is = "HDMI out 2" If hs.DeviceValue(devid) <> data(1) Then hs.SetDeviceValueByRef(devid, data(1), True) Else hs.SetDeviceValueByRef(devid, data(1), False) End If Case Is = "HDMI out 3" If hs.DeviceValue(devid) <> data(2) Then hs.SetDeviceValueByRef(devid, data(2), True) Else hs.SetDeviceValueByRef(devid, data(2), False) End If Case Is = "HDMI out 4" If hs.DeviceValue(devid) <> data(3) Then hs.SetDeviceValueByRef(devid, data(3), True) Else hs.SetDeviceValueByRef(devid, data(3), False) End If End Select Next End Sub Gir:
  23. Lar deg sette en vilkårlig device som Root med vilkårlige devicer som Child Devices. Parameter: RooTID|child1ID,child2ID,etc Sub Main(ByVal params As String) Dim lines() As String = params.ToString.Split("|") Dim rootRef As Integer = lines(0) Dim children() As String = lines(1).Split(",") Dim rootDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootRef) rootDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root Dim childDevice As Scheduler.Classes.DeviceClass For Each c As Integer In children childDevice = hs.GetDeviceByRef(c) rootDevice.AssociatedDevice_Add(hs, c) childDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child childDevice.AssociatedDevice_Add(hs, rootRef) Next End Sub
  24. For å teste meg litt så satte jeg igang med ett script (c#) for å hente badetemperaturer fra yr. Yr legger alle badetemperaturer ut som en xml fil på adressen http://om.yr.no/badetemperatur/badetemperatur.xml Jeg har laget en liten scriptsnutt som henter ned xml, plukker ut fylket. Løper igjennom alle temperaturer for fylket og gir ett snitt. Grunnen til at jeg kan ta for hele fylket er at så lenge jeg har fulgt med så har Østfold kun fått varsling for 2 steder og begge er på Jeløya. Og siden det er der jeg bor så tenkte jeg i utgangspunktet å ta snittet. Mulig jeg kommer til å flikke mer på scriptet etterhvert for i tillegg å plukke ut høyeste og laveste. Hva gjør man for å bruke dette scriptet? Først lager du en virtual device Og i den spesifiserer du ett navn, setter den som Status Only Device Setter grafikk hvis det interresserer deg Og til slutt går inn på advanced (jeg er usikker på om ID er laget idet man trykker for ny device eller om du må inn etter at du har lagret første gangen). Det som er viktig her er Reference ID. Legg til scriptet under i homeseer sin scriptkatalog (hos meg er den å finne i C:\Program Files (x86)\HomeSeer HS3\scripts). Filen må ha endelse/extension .cs. I mitt tilfelle har jeg kalt det YrBadetemperatur.cs som gir full path: C:\Program Files (x86)\HomeSeer HS3\scripts\YrBadetemperatur.cs using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml; public object Main(object[] Parms) { int virtualDeviceId = 154; //Virtuell device reference id som man har definert for å legge inn tekstverdien fra yr string countyId = "01"; //Hvilket fylke man skal hente inn verdier fra string logName="GuahtdimYrBade";//Her kan man sette inn hva man vil. Det er første kolonne i loggen hs.WriteLog(logName,"Start Yr badetemp" ); System.Net.WebRequest webRequest = System.Net.WebRequest.Create(@"http://om.yr.no/badetemperatur/badetemperatur.xml"); System.IO.Stream content; System.Net.WebResponse response = webRequest.GetResponse(); //Håndtere gzip av content if (((System.Net.HttpWebResponse)response).ContentEncoding =="gzip") { content = new System.IO.Compression.GZipStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress); } else { content = response.GetResponseStream(); } System.IO.StreamReader reader = new System.IO.StreamReader(content); string strContent = reader.ReadToEnd(); if (strContent.Length > 0) { int startPoint = strContent.IndexOf("\n", StringComparison.InvariantCulture) + 1;//Fjerner første xml linje <?xml version="1.0" encoding="UTF-8"?> strContent = strContent.Substring(startPoint); System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument(); xmlDocument.LoadXml(strContent); System.Xml.XmlNode ostfoldNode = xmlDocument.SelectSingleNode("//badetemp/badetemperaturer/county[@id='" + countyId + "']"); if (ostfoldNode != null) { System.Xml.XmlNodeList tempNodes = ostfoldNode.SelectNodes("//county[@id='" + countyId + "']/place/temperature"); if (tempNodes != null) { int totaltTemp = 0; int counter = 0; //Henter inn alle vanntemperaturer for fylket og gjør det mulig å lage snitt foreach (System.Xml.XmlNode tempNode in tempNodes) { System.Xml.XmlAttribute test = tempNode.Attributes["water"]; totaltTemp += int.Parse(test.Value); counter++; } decimal avgTemp =(decimal) (totaltTemp/counter); string badeTempString = "Vanntemperatur Jeløya(snitt): " + avgTemp.ToString("0.0") + "\u00B0C"; hs.SetDeviceString(virtualDeviceId,badeTempString,true); //string stringValue=hs.DeviceString(virtualDeviceId); //hs.WriteLog("From device", stringValue); hs.WriteLog(logName,badeTempString ); } } } hs.WriteLog(logName,"Done" ); return 0; } Etter dette bør du lage en event som tar seg av innhenting av verdier. Jeg har gjort det som bildet under viser Det er bare å komme med spørsmål og ønsker.
  25. Nexst

    ooouups

    Mistenker at jeg har driti på draget, eller hva man skal si. jeg har prøvd å legge inn andre dashboards, for å finne et jeg liker bra. men nå har jeg rotet til det såpass at main domoticz (custom.js) har blitt likt noen av de andre dashboardsa. så nå får jeg ikke åpnet orginal index.html noen forslag? sliter litt her nå gitt.. prøvd å lete meg frem etter backup også. har vel egentlig tatt backup før men,, aner ikke hva jeg skal gjøre.
  • Medlemsstatistikk

    2 892
    Totalt antall medlemmer
    846
    Flest pålogget
    JML
    Nyeste medlem
    JML
    Ble med
×