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

Anbefalte innlegg

Skrevet

Har kjøpt noen Sonoff Pow moduler som jeg ønsker å implementere i HS3 via MQTT plugin.

Pow enhetene er flashet med firmware fra https://github.com/arendst/Sonoff-Tasmota.

Alt er integrert greit med MQTT og HS3 og jeg kan slå av og på enhetene.

Utfordringen er å få inn Watt osv i HS3. Pow enhetene sender en json string som må parses for å lese ut watt verdien. Jeg får inn hele denne string i HS3: 

{"Time":"2017-03-05T11:27:13", "Yesterday":0.008, "Today":0.016, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}

Noen som har gjort dette eller vet hvordan det må parses?

 

  • Like 1
Skrevet

Hvis du kan scripte, så ville jeg brukt RegEx for å finne "Power" og lese ut tallet bak kommaet. Kan også gjøres med enkel med strenghåndtering.

 

Her er et utgangspunkt, men du kan ikke putte det rett i et script:

 
        Dim input As String = "{'Time':  '2017-03-05T11:27:13', 'Yesterday':0.008, 'Today':0.016, 'Period':0, 'Power':0, 'Factor':0.00, 'Voltage':0, 'Current':0.000}"

        Dim searchStart As String = "'Today':"
        Dim searchEnd As String = ","
        Dim indexStart As Integer = input.IndexOf(searchStart) + searchStart.Length
        Dim indexStop As Integer = input.IndexOf(searchEnd, indexStart)
        Dim value As Double = CDbl(input.Substring(indexStart, indexStop - indexStart).Replace(".", ","))
        Console.WriteLine(value)
        Console.ReadKey()

 

Skrevet

Takker for svar.

Har ikke scriptet ting til HS3 før. Er det et VBS script du kjører her? Hvordan funker dette?

Skrevet

Takk, jeg prøver om jeg kan finne noe bra info rundt dette inntil det kommer en guide i HomeSeer-skolen ;)

Skrevet (endret)

Har bygget litt videre på scriptet du skrev som utgangspunkt. Ser ut som det funker, men lurer på om det er riktig ("best practice") måte å gjøre det på?

Sub Main(Optional ByVal pParms As String = "")
Const dvref As Integer = 200

Dim input As String = (hs.DeviceString(dvref).Replace("""", ""))

        Dim searchStart As String = "Today:"
        Dim searchEnd As String = ","
        Dim indexStart As Integer = input.IndexOf(searchStart) + searchStart.Length
        Dim indexStop As Integer = input.IndexOf(searchEnd, indexStart)
        Dim value As Double = CDbl(input.Substring(indexStart, indexStop - indexStart).Replace(".", ","))
        hs.SetDeviceValueByRef(201, value, True)
End Sub

Har opprettet en ny virtual device i HS3 som har ID 201 som hetter "kWh today". 

Dette script kjøres da automatisk fra en event hver gang ID 200 (device som får info fra MQTT ) har en ny value set.

Endret av Jepsh
  • Like 1
Skrevet
Et øyeblikk siden, Jepsh skrev:

Ser ut som det funker, men lurer på om det er riktig ("best practice") måte å gjøre det på?

Ser godt ut, bra jobba! :) 

Skrevet

Prøver å lære meg RegEx, så jeg skrev om scriptet ditt litt. Kunne du testet dette for meg?

 

    Sub Main(ByVal parameters As String)
        Const dvref As Integer = 200

        Dim input As String = hs.DeviceString(dvref)
        Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
        Dim match As Text.RegularExpressions.Match = regex.Match(input)

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value)
            hs.SetDeviceValueByRef(201, value, True)
        End If
    End Sub

 

Skrevet

Ser ut som det er et match, men får denne feilen:

Exception has been thrown by the target of an invocation.Conversion from string "5.867" to type 'Double' is not valid.

Skrevet

Ah, pokker! Jeg har jo en ekstra sak jeg glemte å legge til. Det korrekte er her:

 

    Sub Main(ByVal parameters As String)
        Const dvref As Integer = 200

        Dim input As String = hs.DeviceString(dvref)
        Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
        Dim match As Text.RegularExpressions.Match = regex.Match(input)

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
            hs.SetDeviceValueByRef(201, value, True)
        End If
    End Sub

... der .Replace(".", ",") er det eneste nye.

Skrevet

*sukk* alltid er det noe...

La oss prøve å bytte ut if'en med dette:

        If match.Success Then
            Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
            hs.SetDeviceValueByRef(201, value, True)
            hs.WriteLog("RegEx test", "The value was set to: " & value)
		Else
            hs.WriteLog("RegEx test", "No match! :(")	
        End If

... da skal vi i det minste se i loggen hva som skjer...

Skrevet

Sorry! Testet med den nye If block nå og det så bra ut i loggen.

Kom i tanke om device setting - Do not update device last change time if device value does not change. Denne var selvfølgelig enabled.

Testet da igjen med det første regex scriptet du sendte og da så alt bra ut ?

Her er scriptet jeg bruker akkurat nå: 

Sub Main(ByVal pParms As String)
    Dim dvref() As String = Split(pParms.ToString, "|")

    Dim input As String = hs.DeviceString(dvref(0))
    Dim regex As New Text.RegularExpressions.Regex("(?<=""Today"":)[^,]+(?=,)")
    Dim match As Text.RegularExpressions.Match = regex.Match(input)

    If match.Success Then
        Dim value As Double = CDbl(match.Groups(0).Value.Replace(".", ","))
        hs.SetDeviceValueByRef(dvref(1), value, True)
    End If
End Sub

Det tar da parametre input|output

Neste versjon må være med parameter hvor man kan spesifisere today, yesterday, power, voltage og current :)

 

Et lite spørsmål på siden her - hvordan får jeg denne device inkludert i HS3 sin Energy logging?

Skrevet
4 minutter siden, Jepsh skrev:

Det tar da parametre input|output

Foreslår parameter|input|output. Og så erstatte Regex("(?<=""Today"":)[^,]+(?=,)") med dette: Regex("(?<=""" & dvref(0) & """:)[^,]+(?=,)")

 

Men istedenfor å bruke dvRef() ville jeg definerte eksplisitte variabler. (F.eks. Dim parameter as String = pParms.Split("|")(0), etc).

 

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.