Christian Skrevet 29. desember 2017 Skrevet 29. desember 2017 Jeg har laget ett script for Multiroom Audio. Jeg har basert det på 3 chromcast, to til radio, og en som er dedikert til å spille Spotify, Tidal eller annen streaming. Jeg har laget events som kobler opp inngang mot utgang, og som stopper, muter og justerer volum. Tilkobling til matrisa mi, som er en ClearOne PSR1212, er gjort ved hjelp av Drules IP plugin. Devicene er foreløpig laget manuelt, og det er kun enveis til matrisa. Dette er ting som sannsynligvis kommer i forbedringer av skriptet. Dette er mitt første nogenlunde fornuftige program i vb.net, så det er lov å komme med forslag til forbedring. Sikkert mange plasser dette kunne vært gjort smartere. Koden er vist under. Dim Inngangskorreksjon As Integer = 6 Dim Rooms() As String = {"Bad", "Kjøkken", "Forside", "Vaskerom", "Garasje", "Stue", "Soverom", "Kjellergang", "Forside"} Dim Kanaler() As String = {"NRK P1", "NRK P1+", "P4", "NRJ", "Radio Norge"} Dim Player As String = "Chromecast_kanal_" Dim NumberOfPlayers As Integer = 2 Dim Parameter1 As String Dim Room As String Dim Roomstatus As String Dim index As Integer Dim Utgang As Integer Public Sub Main(ByVal Parms As Object) Dim input() As String = SplitParameters(Parms) Room = Input(1) Parameter1 = input(0) ActionChoice(Parameter1, Room) End Sub Public Sub TouchMain(ByVal Parms As Object) Parameter1 = Parms(0).ToString Room = Parms(1).ToString ActionChoice(Parameter1, Room) End Sub 'Setter Action etter hva Parameter1 er Public Sub ActionChoice(ByVal Parameter1 As String, ByVal Room As String) Dim Utgang As Integer = Array.IndexOf(Rooms, Room) + 1 Select Case Parameter1 Case "VOL UP" hs.TriggerEvent("Volum Opp Utgang " & Utgang) Case "VOL DWN" hs.TriggerEvent("Volum ned Utgang " & Utgang) Case "Slå av Rom" hs.WriteLog("slå av rom", "Slå av Rom") Stop_Room(Room) Case "Mute" hs.TriggerEvent("Mute Utgang " & Utgang) Case "Media" hs.TriggerEvent("Koble ned Utgang " & Utgang) hs.TriggerEvent("Koble inngang 1 til utgang " & Utgang) Case "Lyd fra TV" hs.TriggerEvent("Koble ned Utgang " & Utgang) hs.TriggerEvent("Koble inngang 2 til utgang " & Utgang) Case Else SetPlayer(Parameter1) 'Sender verdier til Homeseer Sett_Utgang() SetHSValues() End Select End Sub 'Splitter Parms inn i de to parameterne som den skal være Public Function SplitParameters(ByVal Params As Object) As String() Dim SplitString As String SplitString = Params.ToString Dim Parameters As String() = SplitString.Split(New Char() {"|"c}) Return Parameters End Function 'Setter hvilken spille som skal spille Public Sub SetPlayer(ByVal Radiokanal As String) Dim Channelplay As Integer = ChannelPlaying(Parameter1) 'Sjekker hvilken spiller som har spilt lengst - Returnerer Setplayer til ActionChoice Dim Timers(NumberOfPlayers) As String Dim RadioChannel(NumberOfPlayers) As String Dim t, i, Max As Integer For t = 1 To NumberOfPlayers Timers(t) = hs.DeviceValueByName(Player & "timer_" & t) If Timers(t) = 0 Then index = t Exit For Else If Channelplay = 0 Then For i = 1 To UBound(Timers) If Timers(i) > Timers(Max) Then Max = i End If Next index = Max Disconnect_playing() Else index = Channelplay End If End If Next End Sub 'Setter hvilken utgang som skal brukes Public Sub Sett_Utgang() Dim Checkparameter As Integer = Array.IndexOf(Rooms, Parameter1) + 1 If Checkparameter = 0 Then Utgang = Array.IndexOf(Rooms, Room) + 1 Else If Roomstatus = "Off" Then Exit Sub 'index = Right(Roomstatus, 1) Utgang = Array.IndexOf(Rooms, Parameter1) + 1 End If End Sub 'skriver Verdier til HS3 Public Sub SetHSValues() Dim Playing As Integer = ChannelPlaying(Parameter1) Dim Inngang As Integer = index + Inngangskorreksjon Dim kanal As Integer kanal = Array.IndexOf(Kanaler, Parameter1) + 1 If Playing = False Then hs.SetDeviceValueByName(Player & index, kanal) End If hs.WriteLog("etst", "Koble Inngang " & Inngang & " til Utgang " & Utgang) hs.SetDeviceValueByName("Utgang " & Utgang & " - " & Room, index) hs.TriggerEvent("Koble ned Utgang " & Utgang) hs.TriggerEvent("Start Chromecast Timer " & index) hs.TriggerEvent("Koble Inngang " & Inngang & " til Utgang " & Utgang) End Sub 'Sjekker om kanalen spiller i noen av spilerne Public Function ChannelPlaying(ByVal Channel As String) As Integer Dim t As Integer For t = 1 To 2 Dim Channelstatus = hs.DeviceVSP_GetStatus(hs.GetDeviceRefByName(Player & t), hs.DeviceValueByName(Player & t), 1) If Channel = Channelstatus Then ChannelPlaying = t Exit For End If Next Return ChannelPlaying End Function 'Sjekker om noen av utgangene spiller den kanalen fra før Public Function SpotiPlaying() As Boolean Dim Roomstatus = hs.DeviceVSP_GetStatus(hs.GetDeviceRefByName("Utgang " & Utgang & " - " & Room), hs.DeviceValueByName("Utgang " & Utgang & " - " & Room), 1) Dim SpotiPlay As String = Right(Roomstatus, 1) For t = 1 To 9 If t = Utgang Then Continue For End If Dim SpotiPlaytestValue = hs.DeviceVSP_GetStatus(hs.GetDeviceRefByName("Utgang " & t & " - " & Rooms(t - 1)), hs.DeviceValueByName("Utgang " & t & " - " & Rooms(t - 1)), 1) If SpotiPlaytestValue <> "Off" Then Dim spotiplaytest As String = Right(SpotiPlaytestValue, 1) If SpotiPlay = spotiplaytest Then SpotiPlaying = True Exit For End If End If Next Return SpotiPlaying End Function 'Slå av Rom Public Sub Stop_Room(ByVal Room As String) Sett_Utgang() Dim Playing As Boolean = SpotiPlaying() Dim Roomstatus = hs.DeviceVSP_GetStatus(hs.GetDeviceRefByName("Utgang " & Utgang & " - " & Room), hs.DeviceValueByName("Utgang " & Utgang & " - " & Room), 1) If Playing = False Then hs.WriteLog("Roomstatus", Roomstatus) If Right(Roomstatus, 1) <= NumberOfPlayers Then hs.TriggerEvent("Stopp Chromecast Timer " & Right(Roomstatus, 1)) hs.SetDeviceValueByName(Player & Right(Roomstatus, 1), 0) hs.SetDeviceValueByName("ChromeCast status " & Right(Roomstatus, 1), 1) End If End If hs.TriggerEvent("Koble ned Utgang " & Utgang) hs.SetDeviceValueByName("Utgang " & Utgang & " - " & Room, 0) End Sub Public Sub Disconnect_playing() For t = 0 To 8 Dim Status = hs.DeviceVSP_GetStatus(hs.GetDeviceRefByName("Utgang " & t + 1 & " - " & Rooms(t)), hs.DeviceValueByName("Utgang " & t + 1 & " - " & Rooms(t)), 1) If Status <> "Off" Then If Right(Status, 1) = index Then hs.TriggerEvent("Koble ned Utgang " & t + 1) hs.SetDeviceValueByName("Utgang " & t + 1 & " - " & Rooms(t), 0) hs.WriteLog("Utgang", "Utgang " & t + 1 & " - " & Rooms(t)) End If End If Next End Sub 1 Siter
Moskus Skrevet 30. desember 2017 Skrevet 30. desember 2017 hs.DeviceValueByName() bør byttes med hs.DeviceValue() 'altså by RefId ... og heller lagre Device-ref'ene i en INI-fil eller noe slikt, hvis det er ment for at flere skal kunne bruke scriptet. Ellers kan du risikere at andre bruker andre navn enn deg. Siter
Christian Skrevet 1. januar 2018 Forfatter Skrevet 1. januar 2018 Men RefId'er blir jo opprettet automatisk, navn kan du jo endre selv.... Så blir vel mer krøll med RefID ? Siter
Moskus Skrevet 1. januar 2018 Skrevet 1. januar 2018 4 timer siden, Christian skrev: Men RefId'er blir jo opprettet automatisk, navn kan du jo endre selv.... Så blir vel mer krøll med RefID ? Nei, motsatt: Mindre krøll. Det er 100% unikt. Garantert ikke krøll med devicer med like navn eller like "address". Siter
Christian Skrevet 1. januar 2018 Forfatter Skrevet 1. januar 2018 (endret) 26 minutter siden, Moskus skrev: Nei, motsatt: Mindre krøll. Det er 100% unikt. Garantert ikke krøll med devicer med like navn eller like "address". Ja, okei. Når jeg tenker meg om, så skjønte jeg plutselig hva du mente. Da må jeg bare finne ut hvordan jeg legger dette i en ini fil så man kan sette det opp der etter hvilken ID devicene har. Det får komme i neste versjon. Endret 1. januar 2018 av Christian Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.