Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Multiroom audio script


Christian

Anbefalte innlegg

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

 

  • Like 1
Lenke til kommentar
Del på andre sider

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.

Lenke til kommentar
Del på andre sider

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".

Lenke til kommentar
Del på andre sider

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 av Christian
Lenke til kommentar
Del på andre sider

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.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.